我们有一个云形成堆栈,其中包含RDS、S3等数据存储资源。我们希望保留它们,即使堆栈被删除或在升级堆栈时,很少有参数会导致服务重新创建。因此我们将删除策略设置为CCD_ 1。现在,当我重新运行堆栈时,它无法创建资源,因为存在同名的资源。
我想通过检查资源是否存在来创建资源。云的形成本身有可能受到这种制约吗。我还意识到,保留的资源已经变成了胭脂资源,因为它们现在不是云形成的一部分。
绕过此解决方案的最佳方法是什么?
您必须将这些bucket导入回堆栈中。
遗憾的是,CFN没有检查某个东西是否存在以及自动执行导入的功能。因此,您必须使用AWS控制台手动完成,或者使用SDK或CLI以编程方式完成。
这通常是一个复杂的问题,如果不了解您的设置和特定的CF模板,很难给出具体的建议。我将阐述一些一般性观点和建议的行动。
-
";当我重新运行堆栈时,它无法创建资源,因为存在具有相同名称的资源"-这是命名资源的常见问题。作为一般指导,避免对这些资源进行静态命名,因为操作员不会与这些资源进行交互。如果有严格的命名约定,那么总是在名称中添加随机后缀,这将使它们在堆栈中是唯一的。
-
如果您有存储资源,即S3存储桶和DB,那么可以考虑将它们放入单独的CF堆栈中,并将相关属性(如DB端点地址(公开为CF导出。您可以使用
Fn::ImportValue
在其他堆栈中引用它们。通过这种方式,您可以将";稳定的";来自";挥发性";一些,仍然有CF的好处。 -
您可以将一些现有资源导入CF堆栈。它们将作为堆栈的合法部分。但并不是所有的资源都可以像这样导入。
我认为是的,您可以通过在CFN中设置一个条件来实现这一点,无论是在JSON/YAML 中
{
"AWSTemplateFormatVersion": "2010-09-09",
"Transform": "AWS::Serverless-2016-10-31",
"Description": "",
"Parameters": {
"ShouldCreateBucketInputParameter": {
"Type": "String",
"AllowedValues": [
"true",
"false"
],
"Description": "If true then the S3 bucket that will be proxied will be created with the CloudFormation stack."
}
},
"Conditions": {
"CreateS3Bucket": {
"Fn::Equals": [
{
"Ref": "ShouldCreateBucketInputParameter"
},
"true"
]
}
},
"Resources": {
"SerialNumberBucketResource": {
"Type": "AWS::S3::Bucket",
"Condition": "CreateS3Bucket",
"Properties": {
"AccessControl": "Private"
}
}
}
}
然后使用CLI,您只需要设置";真";或";false";
aws cloudformation deploy --template ./s3BucketWithCondition.json --stack-name bucket-stack --parameter-overrides ShouldCreateBucketInputParameter="true"