Amazon web services 如果资源已经存在,如何不中断?
我有以下AWS Cloudformation配置,它设置了S3存储库 当我通过ansible playbook运行它时,在第二次运行playbook时会发生这种情况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::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上擦除生产将不好。我已经更新了答案,提供了更多关于“替换”更新的详细信息。如果您还有问题没有回答,请告诉我。好的,我想我基本上需要将我的环境创建代码与部署代码分开。我只运行了一次,没有硬编码的资源名称。然后让我的部署代码假设服务器已经准备好