Prevent Resource Creation with SCP
In some cases you can use Service Control Policies for this type of requirement, but only relating to properties of the resource being created - AFAIK it won't work to say "you can't create an EC2 instance if a CloudWatch alarm hasn't been created".
AWS has some example Service Control Policies on this page, I'll copy one below. I've used this technique to do things like prevent EC2 instance creation if it isn't encrypted, if the EBS volume isn't encrypted, and prevent RDS creation if the storage isn't encrypted.
Example SCP from Amazon: With this SCP, any instance launches not using the t2.micro instance type are denied.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "RequireMicroInstanceType",
"Effect": "Deny",
"Action": "ec2:RunInstances",
"Resource": "arn:aws:ec2:*:*:instance/*",
"Condition": {
"StringNotEquals":{
"ec2:InstanceType":"t2.micro"
}
}
}
]
}
Automatic Remediation
You could consider automatic remediation after resources are created. Something like AWS Config can get notified every time a resource is created, run a Lambda script, which you can then run custom code to detect state and set up related resources. Again, this is custom, but we've done this in the past. For example, when an S3 bucket is created we've turned on logging and versioning unless a specific tag was in place.
In the same way, you could delete resources that are non-compliant rather than automatically remedating.
Preventing Resource Creation with IAM Permissions
Instead of removing resources that aren't compliant you could look at reducing permissions for users so they can't directly create resources, and putting in place some kind of a self service system that sets up resources for them, with all required related resources set up. I haven't done this myself, so I can't say exactly how to do it.
This could be as simple as allowing CloudFormation templates you supply to run under a service role, but not allowing users permissions to create the resources directly.