Amazon web services 如果资源已经存在,如何不中断?

Amazon web services 如果资源已经存在,如何不中断?,amazon-web-services,amazon-cloudformation,Amazon Web Services,Amazon Cloudformation,我有以下AWS Cloudformation配置,它设置了S3存储库 当我通过ansible playbook运行它时,在第二次运行playbook时会发生这种情况 AWS::ECR::Repository Repository CREATE_FAILED: production-app-name already exists etc 我怎样才能使它在多次运行时,保留现有的s3和存储库,而不是仅仅炸毁?(我假设param“DeletionPolicy”:“Retain”,会这样做) 我想要实现

我有以下AWS Cloudformation配置,它设置了S3存储库

当我通过ansible playbook运行它时,在第二次运行playbook时会发生这种情况

AWS::ECR::Repository Repository CREATE_FAILED: production-app-name already exists
etc
我怎样才能使它在多次运行时,保留现有的s3和存储库,而不是仅仅炸毁?(我假设param
“DeletionPolicy”:“Retain”,
会这样做)

我想要实现的目标:

如果我运行这个100x,我希望资源状态与运行#1后的状态相同。我不希望删除任何资源或删除任何数据

{


 "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "Pre-reqs for Elastic Beanstalk application",
  "Parameters": {
    "BucketName": {
      "Type": "String",
      "Description": "S3 Bucket name"
    },
    "RepositoryName": {
      "Type": "String",
      "Description": "ECR Repository name"
    }
  },
  "Resources": {
    "Bucket": {
      "Type": "AWS::S3::Bucket",
      "DeletionPolicy": "Retain",
      "Properties": {
        "BucketName": { "Fn::Join": [ "-", [
          { "Ref": "BucketName" },
          { "Ref": "AWS::Region" }
        ]]}
      }
    },
    "Repository": {
      "Type": "AWS::ECR::Repository",
      "DeletionPolicy": "Retain",
      "Properties": {
        "RepositoryName": { "Ref": "RepositoryName" }
      }
    }
  },
  "Outputs": {
    "S3Bucket": {
      "Description": "Full S3 Bucket name",
      "Value": { "Ref": "Bucket" }
    },
    "Repository": {
      "Description": "ECR Repo",
      "Value": { "Fn::Join": [ "/", [
        {
          "Fn::Join": [ ".", [
            { "Ref": "AWS::AccountId" },
            "dkr",
            "ecr",
            { "Ref": "AWS::Region" },
            "amazonaws.com"
          ]]
        },
        { "Ref": "Repository" }
      ]]}
    }
  }
}
编辑:

运行两次时出现类似问题的DB

{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Parameters": {
        "DBPassword": {
            "MinLength": "8",
            "NoEcho": true,
            "Type": "String"
        },
        "Environment": {
            "MinLength": "1",
            "Type": "String"
        },
        "DBName": {
            "Type": "String",
            "Description": "DBName"
        },
        "DBInstanceIdentifier": {
            "Type": "String",
            "Description": "DBInstanceIdentifier"
        },
        "DBPort": {
            "Type": "String",
            "Description": "DBPort"
        },
        "DBUsername": {
            "Type": "String",
            "Description": "DBName"
        }
    },
    "Outputs": {
        "Url": {
            "Value": {
                "Fn::Sub": "postgres://${DBUsername}:${DBPassword}@${Instance.Endpoint.Address}:${Instance.Endpoint.Port}/${DBName}"
            }
        }
    },
    "Resources": {
        "Instance": {
            "Type": "AWS::RDS::DBInstance",
            "DeletionPolicy": "Retain",
            "Properties": {
                "AllocatedStorage": "10",
                "DBInstanceClass": "db.t2.micro",
                "DBInstanceIdentifier": {"Ref": "DBInstanceIdentifier"},
                "DBName": {
                    "Ref": "DBName"
                },
                "Engine": "postgres",
                "EngineVersion": "9.6.6",
                "MasterUsername": {
                    "Ref": "DBUsername"
                },
                "MasterUserPassword": {
                    "Ref": "DBPassword"
                },
                "MultiAZ": "false",
                "Port": {
                    "Ref": "DBPort"
                },
                "PubliclyAccessible": "false",
                "StorageType": "gp2"
            }
        }
    }
}

实际上,
AWS::ECR::Repository
中的
RepositoryName
字段不是必需的,我建议不要指定。通过让CloudFormation为存储库动态分配一个唯一的名称,可以避免冲突

如果以后要使用存储库名称,例如:在任务定义中,可以使用
“Ref”
函数,如so
{“Ref”:“repository”}
来提取CloudFormation生成的唯一名称

至于RDS实例的问题,tt归结为硬编码资源名称的相同问题

使用
retain
将使资源保持活动状态,但它将不再由CloudFormation管理,这是一个大问题

只需确保在执行更新时从不修改需要资源“替换”的参数。文档中始终说明参数更改将导致何种更新

图片取自()


如果确实需要更改需要替换的参数。使用适配器参数创建新资源,迁移数据库或ECR存储库中的所有数据,然后从模板中删除旧资源。如果不需要迁移任何内容,请确保没有硬编码的名称,并让CloudFormation执行替换。

Hmm好的。我还有一个“AWS::RDS::DBInstance”资源,它也有同样的问题。我该如何处理这个问题?(在上面的orig帖子中添加了配置)在以前的每次部署中,默认情况下都会删除DB实例,然后我添加了“DeletionPolicy”:“Retain”,“now it”错误表示它已经存在。另外,为了澄清这一点,上面的配置是在应用程序的每个部门上运行的,因此对于所有这些资源,我需要保留数据。在每个deply上擦除生产将不好。我已经更新了答案,提供了更多关于“替换”更新的详细信息。如果您还有问题没有回答,请告诉我。好的,我想我基本上需要将我的环境创建代码与部署代码分开。我只运行了一次,没有硬编码的资源名称。然后让我的部署代码假设服务器已经准备好