AWS CloudFormation的create-stack和deploy有何区别?

50

有人能够清楚地解释一下 AWS CLI Cloudformationcreate-stackdeploy 命令之间的区别和优先级吗?对我来说,它们似乎做同样的事情并部署资源。

为什么当你从CLI运行deploy命令时,create stack没有可执行的变更集,而文档却说:

通过创建并执行更改集部署指定的AWS CloudFormation模板。在AWS CloudFormation执行更改集后,该命令将终止。如果要在AWS CloudFormation执行更改集之前查看更改集,请使用--no-execute-changeset标志。

3个回答

54

create-stack 只能用于创建新堆栈。如果您要更新堆栈,则必须使用其他命令,等等。如果您正在编写批处理文件来帮助运行CloudFormation,这可能会非常麻烦。

deploy 是更好地利用变更集的功能 - 而不是必须知道堆栈是否存在,您可以直接运行部署工具,它将确定它需要做什么。 使用 --no-execute-changeset,它实际上会为您提供所需的命令,如果您决定在应用更改之前查看更改,则可以使用该命令。

看起来这是在2016年11月引入的,可能是在发布变更集时。


是的,你说得对。那么我的最后一个问题呢:为什么当你从cli运行部署命令时,创建堆栈没有可执行的更改集? - nixmind

18

我认为deploy只是在CreateChangeSetCreateStackUpdateStack API方法周围增加了语法糖。

请注意,尽管CLI中有deploy,但在API参考资料中没有它。

我认为在不需要显式审核更改集的情况下,首选deploy。如果不使用deploy,您可能需要create-change-set,然后决定创建或更新堆栈。在这种情况下,deploy就像一个堆栈“upsert”。


我停止了懒惰并检查了代码,确实-deploy最终是从CLI中更好地使用cloudformation的方式。实现在此处此处。请注意,截至今天,控制回滚行为的能力对于deploy不存在,根据此问题


0

当你改变参数默认值(在我的情况下是LatestAmi)时,要注意deploy命令的奇怪行为。

$ cat ec2.yaml 
AWSTemplateFormatVersion: "2010-09-09"

Parameters:
  LatestAmi: 
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: /aws/service/canonical/ubuntu/server/20.04/stable/current/amd64/hvm/ebs-gp2/ami-id
    
Resources:
  MyInstance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref LatestAmi
      InstanceType: t2.micro
      Tags:
        - Key: Name
          Value: cfn-deploy
$ aws cloudformation deploy --template-file ec2.yaml --stack-name cfn-deploy

Waiting for changeset to be created..
Waiting for stack create/update to complete
Successfully created/updated stack - cfn-deploy
$ cat ec2.yaml 
AWSTemplateFormatVersion: "2010-09-09"

Parameters:
  LatestAmi: 
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2

Resources:
  MyInstance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref LatestAmi
      InstanceType: t2.micro
      Tags:
        - Key: Name
          Value: cfn-deploy
$ aws cloudformation deploy --template-file ec2.yaml --stack-name cfn-deploy

Waiting for changeset to be created..

No changes to deploy. Stack cfn-deploy is up to date
$ aws --version
aws-cli/2.5.2 Python/3.9.11 Linux/5.15.0-23-generic exe/x86_64.ubuntu.22 prompt/off

如果使用update-stack命令,则实例将被请求的AMI替换。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接