Skip to content
This repository has been archived by the owner on Nov 7, 2019. It is now read-only.

Code Generate All CFN Resources #153

Open
christopherhein opened this issue Jan 15, 2019 · 14 comments
Open

Code Generate All CFN Resources #153

christopherhein opened this issue Jan 15, 2019 · 14 comments
Labels
hold This is waiting on another issue new-resource All new resource requests

Comments

@christopherhein
Copy link
Contributor

Idea

Using the AWS CloudFormation Resource Specification code generate all resources instead of having to manually design each resource.

Spec: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-resource-specification.html

Example S3 Bucket Spec

{
  "PropertyTypes": {
    "AWS::S3::Bucket.AbortIncompleteMultipartUpload": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-abortincompletemultipartupload.html",
      "Properties": {
        "DaysAfterInitiation": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-abortincompletemultipartupload.html#cfn-s3-bucket-abortincompletemultipartupload-daysafterinitiation",
          "PrimitiveType": "Integer",
          "Required": true,
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.AccelerateConfiguration": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-accelerateconfiguration.html",
      "Properties": {
        "AccelerationStatus": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-accelerateconfiguration.html#cfn-s3-bucket-accelerateconfiguration-accelerationstatus",
          "PrimitiveType": "String",
          "Required": true,
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.AccessControlTranslation": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-accesscontroltranslation.html",
      "Properties": {
        "Owner": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-accesscontroltranslation.html#cfn-s3-bucket-accesscontroltranslation-owner",
          "PrimitiveType": "String",
          "Required": true,
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.AnalyticsConfiguration": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-analyticsconfiguration.html",
      "Properties": {
        "Id": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-analyticsconfiguration.html#cfn-s3-bucket-analyticsconfiguration-id",
          "PrimitiveType": "String",
          "Required": true,
          "UpdateType": "Mutable"
        },
        "Prefix": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-analyticsconfiguration.html#cfn-s3-bucket-analyticsconfiguration-prefix",
          "PrimitiveType": "String",
          "Required": false,
          "UpdateType": "Mutable"
        },
        "StorageClassAnalysis": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-analyticsconfiguration.html#cfn-s3-bucket-analyticsconfiguration-storageclassanalysis",
          "Required": true,
          "Type": "StorageClassAnalysis",
          "UpdateType": "Mutable"
        },
        "TagFilters": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-analyticsconfiguration.html#cfn-s3-bucket-analyticsconfiguration-tagfilters",
          "DuplicatesAllowed": false,
          "ItemType": "TagFilter",
          "Required": false,
          "Type": "List",
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.BucketEncryption": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-bucketencryption.html",
      "Properties": {
        "ServerSideEncryptionConfiguration": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-bucketencryption.html#cfn-s3-bucket-bucketencryption-serversideencryptionconfiguration",
          "DuplicatesAllowed": false,
          "ItemType": "ServerSideEncryptionRule",
          "Required": true,
          "Type": "List",
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.CorsConfiguration": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-cors.html",
      "Properties": {
        "CorsRules": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-cors.html#cfn-s3-bucket-cors-corsrule",
          "DuplicatesAllowed": false,
          "ItemType": "CorsRule",
          "Required": true,
          "Type": "List",
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.CorsRule": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-cors-corsrule.html",
      "Properties": {
        "AllowedHeaders": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-cors-corsrule.html#cfn-s3-bucket-cors-corsrule-allowedheaders",
          "DuplicatesAllowed": false,
          "PrimitiveItemType": "String",
          "Required": false,
          "Type": "List",
          "UpdateType": "Mutable"
        },
        "AllowedMethods": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-cors-corsrule.html#cfn-s3-bucket-cors-corsrule-allowedmethods",
          "DuplicatesAllowed": false,
          "PrimitiveItemType": "String",
          "Required": true,
          "Type": "List",
          "UpdateType": "Mutable"
        },
        "AllowedOrigins": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-cors-corsrule.html#cfn-s3-bucket-cors-corsrule-allowedorigins",
          "DuplicatesAllowed": false,
          "PrimitiveItemType": "String",
          "Required": true,
          "Type": "List",
          "UpdateType": "Mutable"
        },
        "ExposedHeaders": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-cors-corsrule.html#cfn-s3-bucket-cors-corsrule-exposedheaders",
          "DuplicatesAllowed": false,
          "PrimitiveItemType": "String",
          "Required": false,
          "Type": "List",
          "UpdateType": "Mutable"
        },
        "Id": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-cors-corsrule.html#cfn-s3-bucket-cors-corsrule-id",
          "PrimitiveType": "String",
          "Required": false,
          "UpdateType": "Mutable"
        },
        "MaxAge": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-cors-corsrule.html#cfn-s3-bucket-cors-corsrule-maxage",
          "PrimitiveType": "Integer",
          "Required": false,
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.DataExport": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-dataexport.html",
      "Properties": {
        "Destination": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-dataexport.html#cfn-s3-bucket-dataexport-destination",
          "Required": true,
          "Type": "Destination",
          "UpdateType": "Mutable"
        },
        "OutputSchemaVersion": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-dataexport.html#cfn-s3-bucket-dataexport-outputschemaversion",
          "PrimitiveType": "String",
          "Required": true,
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.Destination": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-destination.html",
      "Properties": {
        "BucketAccountId": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-destination.html#cfn-s3-bucket-destination-bucketaccountid",
          "PrimitiveType": "String",
          "Required": false,
          "UpdateType": "Mutable"
        },
        "BucketArn": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-destination.html#cfn-s3-bucket-destination-bucketarn",
          "PrimitiveType": "String",
          "Required": true,
          "UpdateType": "Mutable"
        },
        "Format": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-destination.html#cfn-s3-bucket-destination-format",
          "PrimitiveType": "String",
          "Required": true,
          "UpdateType": "Mutable"
        },
        "Prefix": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-destination.html#cfn-s3-bucket-destination-prefix",
          "PrimitiveType": "String",
          "Required": false,
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.EncryptionConfiguration": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-encryptionconfiguration.html",
      "Properties": {
        "ReplicaKmsKeyID": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-encryptionconfiguration.html#cfn-s3-bucket-encryptionconfiguration-replicakmskeyid",
          "PrimitiveType": "String",
          "Required": true,
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.FilterRule": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfiguration-config-filter-s3key-rules.html",
      "Properties": {
        "Name": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfiguration-config-filter-s3key-rules.html#cfn-s3-bucket-notificationconfiguraiton-config-filter-s3key-rules-name",
          "PrimitiveType": "String",
          "Required": true,
          "UpdateType": "Mutable"
        },
        "Value": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfiguration-config-filter-s3key-rules.html#cfn-s3-bucket-notificationconfiguraiton-config-filter-s3key-rules-value",
          "PrimitiveType": "String",
          "Required": true,
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.InventoryConfiguration": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-inventoryconfiguration.html",
      "Properties": {
        "Destination": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-inventoryconfiguration.html#cfn-s3-bucket-inventoryconfiguration-destination",
          "Required": true,
          "Type": "Destination",
          "UpdateType": "Mutable"
        },
        "Enabled": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-inventoryconfiguration.html#cfn-s3-bucket-inventoryconfiguration-enabled",
          "PrimitiveType": "Boolean",
          "Required": true,
          "UpdateType": "Mutable"
        },
        "Id": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-inventoryconfiguration.html#cfn-s3-bucket-inventoryconfiguration-id",
          "PrimitiveType": "String",
          "Required": true,
          "UpdateType": "Mutable"
        },
        "IncludedObjectVersions": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-inventoryconfiguration.html#cfn-s3-bucket-inventoryconfiguration-includedobjectversions",
          "PrimitiveType": "String",
          "Required": true,
          "UpdateType": "Mutable"
        },
        "OptionalFields": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-inventoryconfiguration.html#cfn-s3-bucket-inventoryconfiguration-optionalfields",
          "DuplicatesAllowed": false,
          "PrimitiveItemType": "String",
          "Required": false,
          "Type": "List",
          "UpdateType": "Mutable"
        },
        "Prefix": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-inventoryconfiguration.html#cfn-s3-bucket-inventoryconfiguration-prefix",
          "PrimitiveType": "String",
          "Required": false,
          "UpdateType": "Mutable"
        },
        "ScheduleFrequency": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-inventoryconfiguration.html#cfn-s3-bucket-inventoryconfiguration-schedulefrequency",
          "PrimitiveType": "String",
          "Required": true,
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.LambdaConfiguration": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig-lambdaconfig.html",
      "Properties": {
        "Event": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig-lambdaconfig.html#cfn-s3-bucket-notificationconfig-lambdaconfig-event",
          "PrimitiveType": "String",
          "Required": true,
          "UpdateType": "Mutable"
        },
        "Filter": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig-lambdaconfig.html#cfn-s3-bucket-notificationconfig-lambdaconfig-filter",
          "Required": false,
          "Type": "NotificationFilter",
          "UpdateType": "Mutable"
        },
        "Function": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig-lambdaconfig.html#cfn-s3-bucket-notificationconfig-lambdaconfig-function",
          "PrimitiveType": "String",
          "Required": true,
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.LifecycleConfiguration": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig.html",
      "Properties": {
        "Rules": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig.html#cfn-s3-bucket-lifecycleconfig-rules",
          "DuplicatesAllowed": false,
          "ItemType": "Rule",
          "Required": true,
          "Type": "List",
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.LoggingConfiguration": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-loggingconfig.html",
      "Properties": {
        "DestinationBucketName": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-loggingconfig.html#cfn-s3-bucket-loggingconfig-destinationbucketname",
          "PrimitiveType": "String",
          "Required": false,
          "UpdateType": "Mutable"
        },
        "LogFilePrefix": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-loggingconfig.html#cfn-s3-bucket-loggingconfig-logfileprefix",
          "PrimitiveType": "String",
          "Required": false,
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.MetricsConfiguration": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-metricsconfiguration.html",
      "Properties": {
        "Id": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-metricsconfiguration.html#cfn-s3-bucket-metricsconfiguration-id",
          "PrimitiveType": "String",
          "Required": true,
          "UpdateType": "Mutable"
        },
        "Prefix": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-metricsconfiguration.html#cfn-s3-bucket-metricsconfiguration-prefix",
          "PrimitiveType": "String",
          "Required": false,
          "UpdateType": "Mutable"
        },
        "TagFilters": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-metricsconfiguration.html#cfn-s3-bucket-metricsconfiguration-tagfilters",
          "DuplicatesAllowed": false,
          "ItemType": "TagFilter",
          "Required": false,
          "Type": "List",
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.NoncurrentVersionTransition": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule-noncurrentversiontransition.html",
      "Properties": {
        "StorageClass": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule-noncurrentversiontransition.html#cfn-s3-bucket-lifecycleconfig-rule-noncurrentversiontransition-storageclass",
          "PrimitiveType": "String",
          "Required": true,
          "UpdateType": "Mutable"
        },
        "TransitionInDays": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule-noncurrentversiontransition.html#cfn-s3-bucket-lifecycleconfig-rule-noncurrentversiontransition-transitionindays",
          "PrimitiveType": "Integer",
          "Required": true,
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.NotificationConfiguration": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig.html",
      "Properties": {
        "LambdaConfigurations": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig.html#cfn-s3-bucket-notificationconfig-lambdaconfig",
          "DuplicatesAllowed": false,
          "ItemType": "LambdaConfiguration",
          "Required": false,
          "Type": "List",
          "UpdateType": "Mutable"
        },
        "QueueConfigurations": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig.html#cfn-s3-bucket-notificationconfig-queueconfig",
          "DuplicatesAllowed": false,
          "ItemType": "QueueConfiguration",
          "Required": false,
          "Type": "List",
          "UpdateType": "Mutable"
        },
        "TopicConfigurations": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig.html#cfn-s3-bucket-notificationconfig-topicconfig",
          "DuplicatesAllowed": false,
          "ItemType": "TopicConfiguration",
          "Required": false,
          "Type": "List",
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.NotificationFilter": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfiguration-config-filter.html",
      "Properties": {
        "S3Key": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfiguration-config-filter.html#cfn-s3-bucket-notificationconfiguraiton-config-filter-s3key",
          "Required": true,
          "Type": "S3KeyFilter",
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.PublicAccessBlockConfiguration": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-publicaccessblockconfiguration.html",
      "Properties": {
        "BlockPublicAcls": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-publicaccessblockconfiguration.html#cfn-s3-bucket-publicaccessblockconfiguration-blockpublicacls",
          "PrimitiveType": "Boolean",
          "Required": false,
          "UpdateType": "Mutable"
        },
        "BlockPublicPolicy": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-publicaccessblockconfiguration.html#cfn-s3-bucket-publicaccessblockconfiguration-blockpublicpolicy",
          "PrimitiveType": "Boolean",
          "Required": false,
          "UpdateType": "Mutable"
        },
        "IgnorePublicAcls": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-publicaccessblockconfiguration.html#cfn-s3-bucket-publicaccessblockconfiguration-ignorepublicacls",
          "PrimitiveType": "Boolean",
          "Required": false,
          "UpdateType": "Mutable"
        },
        "RestrictPublicBuckets": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-publicaccessblockconfiguration.html#cfn-s3-bucket-publicaccessblockconfiguration-restrictpublicbuckets",
          "PrimitiveType": "Boolean",
          "Required": false,
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.QueueConfiguration": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig-queueconfig.html",
      "Properties": {
        "Event": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig-queueconfig.html#cfn-s3-bucket-notificationconfig-queueconfig-event",
          "PrimitiveType": "String",
          "Required": true,
          "UpdateType": "Mutable"
        },
        "Filter": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig-queueconfig.html#cfn-s3-bucket-notificationconfig-queueconfig-filter",
          "Required": false,
          "Type": "NotificationFilter",
          "UpdateType": "Mutable"
        },
        "Queue": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig-queueconfig.html#cfn-s3-bucket-notificationconfig-queueconfig-queue",
          "PrimitiveType": "String",
          "Required": true,
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.RedirectAllRequestsTo": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration-redirectallrequeststo.html",
      "Properties": {
        "HostName": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration-redirectallrequeststo.html#cfn-s3-websiteconfiguration-redirectallrequeststo-hostname",
          "PrimitiveType": "String",
          "Required": true,
          "UpdateType": "Mutable"
        },
        "Protocol": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration-redirectallrequeststo.html#cfn-s3-websiteconfiguration-redirectallrequeststo-protocol",
          "PrimitiveType": "String",
          "Required": false,
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.RedirectRule": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration-routingrules-redirectrule.html",
      "Properties": {
        "HostName": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration-routingrules-redirectrule.html#cfn-s3-websiteconfiguration-redirectrule-hostname",
          "PrimitiveType": "String",
          "Required": false,
          "UpdateType": "Mutable"
        },
        "HttpRedirectCode": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration-routingrules-redirectrule.html#cfn-s3-websiteconfiguration-redirectrule-httpredirectcode",
          "PrimitiveType": "String",
          "Required": false,
          "UpdateType": "Mutable"
        },
        "Protocol": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration-routingrules-redirectrule.html#cfn-s3-websiteconfiguration-redirectrule-protocol",
          "PrimitiveType": "String",
          "Required": false,
          "UpdateType": "Mutable"
        },
        "ReplaceKeyPrefixWith": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration-routingrules-redirectrule.html#cfn-s3-websiteconfiguration-redirectrule-replacekeyprefixwith",
          "PrimitiveType": "String",
          "Required": false,
          "UpdateType": "Mutable"
        },
        "ReplaceKeyWith": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration-routingrules-redirectrule.html#cfn-s3-websiteconfiguration-redirectrule-replacekeywith",
          "PrimitiveType": "String",
          "Required": false,
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.ReplicationConfiguration": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationconfiguration.html",
      "Properties": {
        "Role": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationconfiguration.html#cfn-s3-bucket-replicationconfiguration-role",
          "PrimitiveType": "String",
          "Required": true,
          "UpdateType": "Mutable"
        },
        "Rules": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationconfiguration.html#cfn-s3-bucket-replicationconfiguration-rules",
          "DuplicatesAllowed": false,
          "ItemType": "ReplicationRule",
          "Required": true,
          "Type": "List",
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.ReplicationDestination": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationconfiguration-rules-destination.html",
      "Properties": {
        "AccessControlTranslation": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationconfiguration-rules-destination.html#cfn-s3-bucket-replicationdestination-accesscontroltranslation",
          "Required": false,
          "Type": "AccessControlTranslation",
          "UpdateType": "Mutable"
        },
        "Account": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationconfiguration-rules-destination.html#cfn-s3-bucket-replicationdestination-account",
          "PrimitiveType": "String",
          "Required": false,
          "UpdateType": "Mutable"
        },
        "Bucket": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationconfiguration-rules-destination.html#cfn-s3-bucket-replicationconfiguration-rules-destination-bucket",
          "PrimitiveType": "String",
          "Required": true,
          "UpdateType": "Mutable"
        },
        "EncryptionConfiguration": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationconfiguration-rules-destination.html#cfn-s3-bucket-replicationdestination-encryptionconfiguration",
          "Required": false,
          "Type": "EncryptionConfiguration",
          "UpdateType": "Mutable"
        },
        "StorageClass": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationconfiguration-rules-destination.html#cfn-s3-bucket-replicationconfiguration-rules-destination-storageclass",
          "PrimitiveType": "String",
          "Required": false,
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.ReplicationRule": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationconfiguration-rules.html",
      "Properties": {
        "Destination": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationconfiguration-rules.html#cfn-s3-bucket-replicationconfiguration-rules-destination",
          "Required": true,
          "Type": "ReplicationDestination",
          "UpdateType": "Mutable"
        },
        "Id": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationconfiguration-rules.html#cfn-s3-bucket-replicationconfiguration-rules-id",
          "PrimitiveType": "String",
          "Required": false,
          "UpdateType": "Mutable"
        },
        "Prefix": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationconfiguration-rules.html#cfn-s3-bucket-replicationconfiguration-rules-prefix",
          "PrimitiveType": "String",
          "Required": true,
          "UpdateType": "Mutable"
        },
        "SourceSelectionCriteria": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationconfiguration-rules.html#cfn-s3-bucket-replicationrule-sourceselectioncriteria",
          "Required": false,
          "Type": "SourceSelectionCriteria",
          "UpdateType": "Mutable"
        },
        "Status": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationconfiguration-rules.html#cfn-s3-bucket-replicationconfiguration-rules-status",
          "PrimitiveType": "String",
          "Required": true,
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.RoutingRule": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration-routingrules.html",
      "Properties": {
        "RedirectRule": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration-routingrules.html#cfn-s3-websiteconfiguration-routingrules-redirectrule",
          "Required": true,
          "Type": "RedirectRule",
          "UpdateType": "Mutable"
        },
        "RoutingRuleCondition": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration-routingrules.html#cfn-s3-websiteconfiguration-routingrules-routingrulecondition",
          "Required": false,
          "Type": "RoutingRuleCondition",
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.RoutingRuleCondition": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration-routingrules-routingrulecondition.html",
      "Properties": {
        "HttpErrorCodeReturnedEquals": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration-routingrules-routingrulecondition.html#cfn-s3-websiteconfiguration-routingrules-routingrulecondition-httperrorcodereturnedequals",
          "PrimitiveType": "String",
          "Required": false,
          "UpdateType": "Mutable"
        },
        "KeyPrefixEquals": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration-routingrules-routingrulecondition.html#cfn-s3-websiteconfiguration-routingrules-routingrulecondition-keyprefixequals",
          "PrimitiveType": "String",
          "Required": false,
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.Rule": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule.html",
      "Properties": {
        "AbortIncompleteMultipartUpload": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule.html#cfn-s3-bucket-rule-abortincompletemultipartupload",
          "Required": false,
          "Type": "AbortIncompleteMultipartUpload",
          "UpdateType": "Mutable"
        },
        "ExpirationDate": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule.html#cfn-s3-bucket-lifecycleconfig-rule-expirationdate",
          "PrimitiveType": "Timestamp",
          "Required": false,
          "UpdateType": "Mutable"
        },
        "ExpirationInDays": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule.html#cfn-s3-bucket-lifecycleconfig-rule-expirationindays",
          "PrimitiveType": "Integer",
          "Required": false,
          "UpdateType": "Mutable"
        },
        "Id": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule.html#cfn-s3-bucket-lifecycleconfig-rule-id",
          "PrimitiveType": "String",
          "Required": false,
          "UpdateType": "Mutable"
        },
        "NoncurrentVersionExpirationInDays": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule.html#cfn-s3-bucket-lifecycleconfig-rule-noncurrentversionexpirationindays",
          "PrimitiveType": "Integer",
          "Required": false,
          "UpdateType": "Mutable"
        },
        "NoncurrentVersionTransition": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule.html#cfn-s3-bucket-lifecycleconfig-rule-noncurrentversiontransition",
          "Required": false,
          "Type": "NoncurrentVersionTransition",
          "UpdateType": "Mutable"
        },
        "NoncurrentVersionTransitions": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule.html#cfn-s3-bucket-lifecycleconfig-rule-noncurrentversiontransitions",
          "DuplicatesAllowed": false,
          "ItemType": "NoncurrentVersionTransition",
          "Required": false,
          "Type": "List",
          "UpdateType": "Mutable"
        },
        "Prefix": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule.html#cfn-s3-bucket-lifecycleconfig-rule-prefix",
          "PrimitiveType": "String",
          "Required": false,
          "UpdateType": "Mutable"
        },
        "Status": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule.html#cfn-s3-bucket-lifecycleconfig-rule-status",
          "PrimitiveType": "String",
          "Required": true,
          "UpdateType": "Mutable"
        },
        "TagFilters": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule.html#cfn-s3-bucket-rule-tagfilters",
          "DuplicatesAllowed": false,
          "ItemType": "TagFilter",
          "Required": false,
          "Type": "List",
          "UpdateType": "Mutable"
        },
        "Transition": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule.html#cfn-s3-bucket-lifecycleconfig-rule-transition",
          "Required": false,
          "Type": "Transition",
          "UpdateType": "Mutable"
        },
        "Transitions": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule.html#cfn-s3-bucket-lifecycleconfig-rule-transitions",
          "DuplicatesAllowed": false,
          "ItemType": "Transition",
          "Required": false,
          "Type": "List",
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.S3KeyFilter": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfiguration-config-filter-s3key.html",
      "Properties": {
        "Rules": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfiguration-config-filter-s3key.html#cfn-s3-bucket-notificationconfiguraiton-config-filter-s3key-rules",
          "DuplicatesAllowed": false,
          "ItemType": "FilterRule",
          "Required": true,
          "Type": "List",
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.ServerSideEncryptionByDefault": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-serversideencryptionbydefault.html",
      "Properties": {
        "KMSMasterKeyID": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-serversideencryptionbydefault.html#cfn-s3-bucket-serversideencryptionbydefault-kmsmasterkeyid",
          "PrimitiveType": "String",
          "Required": false,
          "UpdateType": "Mutable"
        },
        "SSEAlgorithm": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-serversideencryptionbydefault.html#cfn-s3-bucket-serversideencryptionbydefault-ssealgorithm",
          "PrimitiveType": "String",
          "Required": true,
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.ServerSideEncryptionRule": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-serversideencryptionrule.html",
      "Properties": {
        "ServerSideEncryptionByDefault": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-serversideencryptionrule.html#cfn-s3-bucket-serversideencryptionrule-serversideencryptionbydefault",
          "Required": false,
          "Type": "ServerSideEncryptionByDefault",
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.SourceSelectionCriteria": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-sourceselectioncriteria.html",
      "Properties": {
        "SseKmsEncryptedObjects": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-sourceselectioncriteria.html#cfn-s3-bucket-sourceselectioncriteria-ssekmsencryptedobjects",
          "Required": true,
          "Type": "SseKmsEncryptedObjects",
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.SseKmsEncryptedObjects": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-ssekmsencryptedobjects.html",
      "Properties": {
        "Status": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-ssekmsencryptedobjects.html#cfn-s3-bucket-ssekmsencryptedobjects-status",
          "PrimitiveType": "String",
          "Required": true,
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.StorageClassAnalysis": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-storageclassanalysis.html",
      "Properties": {
        "DataExport": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-storageclassanalysis.html#cfn-s3-bucket-storageclassanalysis-dataexport",
          "Required": false,
          "Type": "DataExport",
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.TagFilter": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-tagfilter.html",
      "Properties": {
        "Key": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-tagfilter.html#cfn-s3-bucket-tagfilter-key",
          "PrimitiveType": "String",
          "Required": true,
          "UpdateType": "Mutable"
        },
        "Value": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-tagfilter.html#cfn-s3-bucket-tagfilter-value",
          "PrimitiveType": "String",
          "Required": true,
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.TopicConfiguration": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig-topicconfig.html",
      "Properties": {
        "Event": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig-topicconfig.html#cfn-s3-bucket-notificationconfig-topicconfig-event",
          "PrimitiveType": "String",
          "Required": true,
          "UpdateType": "Mutable"
        },
        "Filter": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig-topicconfig.html#cfn-s3-bucket-notificationconfig-topicconfig-filter",
          "Required": false,
          "Type": "NotificationFilter",
          "UpdateType": "Mutable"
        },
        "Topic": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig-topicconfig.html#cfn-s3-bucket-notificationconfig-topicconfig-topic",
          "PrimitiveType": "String",
          "Required": true,
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.Transition": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule-transition.html",
      "Properties": {
        "StorageClass": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule-transition.html#cfn-s3-bucket-lifecycleconfig-rule-transition-storageclass",
          "PrimitiveType": "String",
          "Required": true,
          "UpdateType": "Mutable"
        },
        "TransitionDate": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule-transition.html#cfn-s3-bucket-lifecycleconfig-rule-transition-transitiondate",
          "PrimitiveType": "Timestamp",
          "Required": false,
          "UpdateType": "Mutable"
        },
        "TransitionInDays": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule-transition.html#cfn-s3-bucket-lifecycleconfig-rule-transition-transitionindays",
          "PrimitiveType": "Integer",
          "Required": false,
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.VersioningConfiguration": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-versioningconfig.html",
      "Properties": {
        "Status": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-versioningconfig.html#cfn-s3-bucket-versioningconfig-status",
          "PrimitiveType": "String",
          "Required": true,
          "UpdateType": "Mutable"
        }
      }
    },
    "AWS::S3::Bucket.WebsiteConfiguration": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration.html",
      "Properties": {
        "ErrorDocument": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration.html#cfn-s3-websiteconfiguration-errordocument",
          "PrimitiveType": "String",
          "Required": false,
          "UpdateType": "Mutable"
        },
        "IndexDocument": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration.html#cfn-s3-websiteconfiguration-indexdocument",
          "PrimitiveType": "String",
          "Required": false,
          "UpdateType": "Mutable"
        },
        "RedirectAllRequestsTo": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration.html#cfn-s3-websiteconfiguration-redirectallrequeststo",
          "Required": false,
          "Type": "RedirectAllRequestsTo",
          "UpdateType": "Mutable"
        },
        "RoutingRules": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration.html#cfn-s3-websiteconfiguration-routingrules",
          "DuplicatesAllowed": false,
          "ItemType": "RoutingRule",
          "Required": false,
          "Type": "List",
          "UpdateType": "Mutable"
        }
      }
    },
    "Tag": {
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html",
      "Properties": {
        "Key": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html#cfn-resource-tags-key",
          "PrimitiveType": "String",
          "Required": true,
          "UpdateType": "Mutable"
        },
        "Value": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html#cfn-resource-tags-value",
          "PrimitiveType": "String",
          "Required": true,
          "UpdateType": "Mutable"
        }
      }
    }
  },
  "ResourceType": {
    "AWS::S3::Bucket": {
      "Attributes": {
        "Arn": {
          "PrimitiveType": "String"
        },
        "DomainName": {
          "PrimitiveType": "String"
        },
        "DualStackDomainName": {
          "PrimitiveType": "String"
        },
        "RegionalDomainName": {
          "PrimitiveType": "String"
        },
        "WebsiteURL": {
          "PrimitiveType": "String"
        }
      },
      "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html",
      "Properties": {
        "AccelerateConfiguration": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-accelerateconfiguration",
          "Required": false,
          "Type": "AccelerateConfiguration",
          "UpdateType": "Mutable"
        },
        "AccessControl": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-accesscontrol",
          "PrimitiveType": "String",
          "Required": false,
          "UpdateType": "Mutable"
        },
        "AnalyticsConfigurations": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-analyticsconfigurations",
          "DuplicatesAllowed": false,
          "ItemType": "AnalyticsConfiguration",
          "Required": false,
          "Type": "List",
          "UpdateType": "Mutable"
        },
        "BucketEncryption": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-bucketencryption",
          "Required": false,
          "Type": "BucketEncryption",
          "UpdateType": "Mutable"
        },
        "BucketName": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-name",
          "PrimitiveType": "String",
          "Required": false,
          "UpdateType": "Immutable"
        },
        "CorsConfiguration": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-crossoriginconfig",
          "Required": false,
          "Type": "CorsConfiguration",
          "UpdateType": "Mutable"
        },
        "InventoryConfigurations": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-inventoryconfigurations",
          "DuplicatesAllowed": false,
          "ItemType": "InventoryConfiguration",
          "Required": false,
          "Type": "List",
          "UpdateType": "Mutable"
        },
        "LifecycleConfiguration": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-lifecycleconfig",
          "Required": false,
          "Type": "LifecycleConfiguration",
          "UpdateType": "Mutable"
        },
        "LoggingConfiguration": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-loggingconfig",
          "Required": false,
          "Type": "LoggingConfiguration",
          "UpdateType": "Mutable"
        },
        "MetricsConfigurations": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-metricsconfigurations",
          "DuplicatesAllowed": false,
          "ItemType": "MetricsConfiguration",
          "Required": false,
          "Type": "List",
          "UpdateType": "Mutable"
        },
        "NotificationConfiguration": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-notification",
          "Required": false,
          "Type": "NotificationConfiguration",
          "UpdateType": "Mutable"
        },
        "PublicAccessBlockConfiguration": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-publicaccessblockconfiguration",
          "Required": false,
          "Type": "PublicAccessBlockConfiguration",
          "UpdateType": "Mutable"
        },
        "ReplicationConfiguration": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-replicationconfiguration",
          "Required": false,
          "Type": "ReplicationConfiguration",
          "UpdateType": "Mutable"
        },
        "Tags": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-tags",
          "DuplicatesAllowed": true,
          "ItemType": "Tag",
          "Required": false,
          "Type": "List",
          "UpdateType": "Mutable"
        },
        "VersioningConfiguration": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-versioning",
          "Required": false,
          "Type": "VersioningConfiguration",
          "UpdateType": "Mutable"
        },
        "WebsiteConfiguration": {
          "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-websiteconfiguration",
          "Required": false,
          "Type": "WebsiteConfiguration",
          "UpdateType": "Mutable"
        }
      }
    }
  },
  "ResourceSpecificationVersion": "2.18.0"
}

Example Kubernetes S3 Custom Resource

apiVersion: "awsoperator.io/v1alpha"
kind: "S3Bucket"
metadata:
  name: "example-s3bucket"
  namespace: "default"
spec:
  accelerate:
    accelerationStatus: "Enabled"
  accessControl: "PublicRead"
  analytics:
  - id: "test-analytics-id"
    prefix: "users"
    storageClassAnalysis:
      dataExport:
        outputSchemaVersion: "V_1"
        destination:
          accountId:
          bucket:
            arn: "[some arn]"
            bucketRef:
              name: "example-s3bucket"
              namespace: "default"
          format: "csv"
          prefix: "test"
    tagFilters:
    - key: "login"
      value: "chris"
  encryption:
    serverSideEncryption:
    - byDefault:
        sseAlgorithm: "aws:kms"
        kmsMasterKeyID: "[some key id]"
  cors:
    rules:
    - allowedHeaders:
      - "Authorization"
    - allowedMethods:
      - "GET"
    - allowedOrigins:
      - "localhost"
    - exposedHeaders:
      - "XMLHttpRequest"
    - id: "allow-authorization-request"
    - maxAge: 60
  inventory:
  - destination:
      accountId:
      bucket:
        arn: "[some arn]"
        bucketRef:
          name: "example-s3bucket"
          namespace: "default"
      format: "csv"
      prefix: "test"
    enabled: true
    id: "test-inventory-configuration"
    includedObjectVersions: "All"
    optionalFields:
    - "Size"
    prefix: "test"
    scheduleFrequency: "Daily"
  lifecycle:
  - rules:
    - abortIncompleteMultipartUpload:
        daysAfterInitiation: 5
      expirationDate: "2008-09-15T15:53:00"
      expirationInDays: 5
      id: "expire-all-keys"
      noncurrentVersionExpirationInDays: 5
      noncurrentVersionTransition:
        storageClass: "GLACIER"
        transitionInDays: 5
      noncurrentVersionTransitions:
      - storageClass: "GLACIER"
        transitionInDays: 5
      prefix: "test"
      status: "Enabled"
      tagFilters:
      - key: "login"
        value: "chris"
      transition:
        storageClass: "GLACIER"
        transitionDate: "2008-09-15T15:53:00"
        transitionInDays: 5
      transitions:
      - storageClass: "GLACIER"
        transitionDate: "2008-09-15T15:53:00"
        transitionInDays: 5
  logging:
    destinationBucketName: "example-s3bucket"
    logFilePrefix: "example"
  metrics:
  - id: "user-metrics"
    prefix: "users"
    tagFilters:
    - key: "login"
      value: "chris"
  notification:
    lambda:
    - event: "s3:ObjectCreated:*"
      filter:
        s3key:
          rules:
          - key: "suffix"
            value: "zip"
      function:
        arn: "[some lambda function arn]"
        functionRef:
          name: "example-function"
          namespace: "default"
    queue:
    - event: "s3:ObjectCreated:*"
      filter:
        s3key:
          rules:
          - key: "suffix"
            value: "zip"
      queue:
        arn: "[some queue arn]"
        queueRef:
          name: "example-queue"
          namespace: "default"
    topic:
    - event: "s3:ObjectCreated:*"
      filter:
        s3key:
          rules:
          - key: "suffix"
            value: "zip"
      topic:
        arn: "[some topic arn]"
        topicRef:
          name: "example-topic"
          namespace: "default"
  publicAccessBlock:
    blockPublicAcls: true
    blockPublicPolicy: true
    ignorePublicAcls: true
    restrictPublicBuckets: true
  replication:
    role: "[iam role arn]"
    rules:
    - destination:
        accessControlTranslation:
          owner: "Destination"
        account: "[some account id]"
        bucket: "us-west-2-example-bucket"
        encryption:
          replicaKmsKeyID:
        storageClass: "STANDARD"
      id: "replicate-us-west-2"
      prefix: "users"
      sourceSelectionCriteria:
        sseKmsEncryptedObjects:
          status: "Enabled"
      status: "Enabled"
  tags: # note the operator will automatically tag resources `aws:operator:name`, `aws:operator:namespace`, `aws:operator:resource-version`, `aws:operator:cluster-name`
  - name: "team" # should these be prefixed with `aws:operator:[name]` or should only the operator specific ones use this... probably only the operator specific
    value: "operations"
  versioning:
    status: "Enabled"
  website:
    errorDocument: "error.html"
    indexDocument: "index.html"
    redirectAllRequestsTo:
      hostName: "awsoperator.io"
      protocol: "https"
    routingRules:
    - redirectRule:
        hostName: "awsoperator.io"
        httpRedirectCode: 301
        protocol: "https"
        replaceKeyPrefixWith: "/docs"
        replaceKeyWith: "/docs"
      routingRuleCondition:
        httpErrorCodeReturnedEquals: 403
        keyPrefixEquals: "/docs"

Changes

You'll notice a few specific ways these are still customized to make composing the resources easier for example we remove the parent key name from nested resources like CorsRules changes to rules under the cors key. Also removing configuration(s) since everything in this is a configuration and that is duplicative. Other component is using similar to Kubernetes core resources like Secrets and ConfigMaps allowing you to reference by ARN or by Kubernetes namespace/name mappings. So if a key is postfixed with Arn convert into something like:

      bucket:
        arn: "[some arn]"
        bucketRef:
          name: "example-s3bucket"
          namespace: "default"
@christopherhein christopherhein added hold This is waiting on another issue new-resource All new resource requests labels Jan 15, 2019
@jlongtine
Copy link

This looks awesome. I was just trying to figure out how to spin up my own definitions... it'd be great to not have to built out resources every time you want a new one.

@christopherhein
Copy link
Contributor Author

christopherhein commented Jan 15, 2019

This looks awesome. I was just trying to figure out how to spin up my own definitions... it'd be great to not have to built out resources every time you want a new one.

Thanks! There are some open items I still need to document, and try and find solutions for. For example the valid responses for CFN params aren't documented which will make automated validation difficult.

@jlongtine
Copy link

What do you mean by "valid responses for CFN params"?

@christopherhein
Copy link
Contributor Author

Sorry, without context that doesn’t make sense. I’ve been trying to implement more logic at the operator/CRD side since k8s can natively validate resources on request, at first glance this isn’t going to be possible with the CFN Resource spec, because I’m the schema there is no key for acceptable values, so if we have a spec.status which the CFN expects to be “enabled” or “disabled” and you set to “true” or “false” you won’t know until the CFN stack fails instead of getting that upfront

@jlongtine
Copy link

@christopherhein Ah, yes.

I wonder if it might be possible to pull some of those sorts of validations out of the API generator models...

As an example:

Amazon CloudFront Distribution LambdaFunctionAssociation has a field EventType, which is a String. But that string is constrained to be a valid value, which is defined in the API docs: LambdaFunctionAssociation.

Those values are: viewer-request | viewer-response | origin-request | origin-response

I'm not precisely sure where to get the canonical versions of these model files... but they seem to be in the generated AWS API clients...

LambdaFunctionAssociation -> EventType -> EventType shape, which is:

    "EventType":{
      "type":"string",
      "enum":[
        "viewer-request",
        "viewer-response",
        "origin-request",
        "origin-response"
      ]
    }

I'll grant the path is a bit circuitous, and may not all be in structured forms. But there might be some potential here...

@christopherhein
Copy link
Contributor Author

@jpeddicord Really great thoughts, will take some work to get them munging together but shouldn't be too difficult!

@jpeddicord
Copy link

@jpeddicord Really great thoughts, will take some work to get them munging together but shouldn't be too difficult!

Think you meant @jlongtine ;P

@christopherhein
Copy link
Contributor Author

That I did :) Thanks!

@jlongtine
Copy link

@christopherhein Great! I'd definitely be interested in helping build out some of this generation (presuming I can manage to find time in addition to my day job 😄).

@christopherhein
Copy link
Contributor Author

@christopherhein Great! I'd definitely be interested in helping build out some of this generation (presuming I can manage to find time in addition to my day job 😄).

Awesome, I'll definitely take you up on that. I'm right now working on the guts of this change likely it won't include things like validation (#164) (also the OpenV3Schema) or defaulting (#163) once the guts are inplace maybe we can work on those other two?

@jlongtine
Copy link

jlongtine commented Feb 11, 2019

Sounds good, @christopherhein 😄

@christopherhein
Copy link
Contributor Author

@jlongtine found something that might be even better, we can contribute back to the cfn-linting project @cmmeyer pointed me to the CFN specs which they've been manually adding AllowedValues as a key for the resources. It's not complete but it gives us a less hacky way of getting all the data.

Check out - aws-cloudformation/cfn-lint#50 if you are interested in adding some of those maps I'm going to change my code generation to reference these.

@jlongtine
Copy link

@christopherhein That looks awesome! I'll see if I can make some time to help flesh this out.

@pawelprazak
Copy link

the goformation project has go structures for all (?) cf resources, I guess they could be just marshalled from yaml, with some metadata added?

https://github.com/awslabs/goformation/tree/master/cloudformation/resources

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
hold This is waiting on another issue new-resource All new resource requests
Projects
None yet
Development

No branches or pull requests

4 participants