教程:创建使用 Amazon CloudFormation 部署操作中的变量的管道
在本教程中,您使用 Amazon CodePipeline 控制台通过部署操作创建管道。管道运行时,模板会创建一个堆栈,另外还创建一个 outputs 文件。堆栈模板生成的输出是 CodePipeline 中的 Amazon CloudFormation 操作生成的变量。
在从模板创建堆栈的操作中,您可以指定一个变量命名空间。然后,后续操作可以使用由 outputs 文件生成的变量。在此示例中,您将基于 StackName 操作生成的 Amazon CloudFormation 变量创建更改集。手动批准后,执行更改集,然后创建删除堆栈操作,此操作根据 StackName 变量删除堆栈。
重要
作为创建管道的一部分,CodePipeline 将使用客户提供的 S3 构件存储桶来存放构件。(这与用于 S3 源操作的存储桶不同。) 如果 S3 构件存储桶所在的账户与您的管道账户不同,请确保 S3 构件存储桶归 Amazon Web Services 账户所有,并且安全可靠。
Amazon CloudFormation 的 CodePipeline 操作在中国(北京)和中国(宁夏)区域不可用。要参考其他可用操作,请参阅 与 CodePipeline 的产品和服务集成。
主题
先决条件:创建 Amazon CloudFormation 服务角色和 CodeCommit 存储库
您必须已经具备以下各项:
-
CodeCommit 存储库。您可以使用在Amazon CodeCommit中创建的 教程:创建一个简单的管道(CodeCommit 存储库) 存储库。
-
此示例从模板创建 Amazon DocumentDB 堆栈。必须使用 Amazon Identity and Access Management (IAM) 创建对 Amazon DocumentDB 具有以下权限的 Amazon CloudFormation 服务角色。
"rds:DescribeDBClusters", "rds:CreateDBCluster", "rds:DeleteDBCluster", "rds:CreateDBInstance"
步骤 1:下载、编辑和上传示例 Amazon CloudFormation 模板
下载示例 Amazon CloudFormation 模板文件并将其上传到您的 CodeCommit 存储库。
-
导航到您所在区域的示例模板。例如,使用表格(https://docs.amazonaws.cn/documentdb/latest/developerguide/quick_start_cfn.html#quick_start_cfn-launch_stack)选择区域并下载模板。下载 Amazon DocumentDB 集群的模板。文件名为
documentdb_full_stack.yaml。 -
解压缩
documentdb_full_stack.yaml文件,然后在文本编辑器中打开它。进行以下更改。-
对于此示例,将以下
Purpose:参数添加到模板中的Parameters部分。Purpose: Type: String Default: testing AllowedValues: - testing - production Description: The purpose of this instance. -
对于此示例,将以下
StackName输出添加到模板中的Outputs:部分。StackName: Value: !Ref AWS::StackName
-
-
将模板文件上传到 Amazon CodeCommit 存储库。您必须将解压缩和编辑的模板文件上传到存储库的根目录。
使用 CodeCommit 控制台上传文件:
-
打开 CodeCommit 控制台,然后从存储库列表中选择您的存储库。
-
选择添加文件,然后选择上传文件。
-
选择选择文件,然后浏览找到您的文件。通过输入您的用户名和电子邮件地址来提交更改。选择提交更改。
文件在存储库的根级别看起来应该像这样:
documentdb_full_stack.yaml -
步骤 2:创建管道
在此部分中,您将使用以下操作创建管道:
-
具有 CodeCommit 操作的源阶段,其中源构件是您的模板文件。
-
一个具有 Amazon CloudFormation 部署操作的部署阶段。
分别向由向导创建的源和部署阶段中的每个操作分配一个变量命名空间 SourceVariables 和 DeployVariables。由于已向操作分配命名空间,因此在此示例中配置的变量可用于下游操作。有关更多信息,请参阅 变量参考。
使用向导创建管道
通过以下网址登录Amazon Web Services 管理控制台并打开 CodePipeline 控制台:http://console.aws.amazon.com/codesuite/codepipeline/home
。 -
在欢迎页面、入门页面或管道页面上,选择创建管道。
-
在步骤 1:选择创建选项页面上的创建选项下,选择构建自定义管道选项。选择下一步。
-
在步骤 2:选择管道设置的管道名称中,输入
MyCFNDeployPipeline。 -
CodePipeline 提供 V1 和 V2 类型的管道,它们在特性和价格上有所不同。在控制台中,您只能选择 V2 类型。有关更多信息,请参阅管道类型。有关 CodePipeline 的定价信息,请参阅定价
。 -
在服务角色中,执行下列操作之一:
-
选择新建服务角色,允许 CodePipeline 在 IAM 中创建服务角色。
-
选择现有服务角色。在角色名称中,从列表中选择您的服务角色。
-
-
在构件存储中:
-
选择默认位置以将默认构件存储(如指定为默认值的 Amazon S3 构件桶)用于为管道选择的区域中的管道。
-
如果您在管道所在的区域中已有构件存储(例如,Amazon S3 构件桶),请选择自定义位置。
注意
这不是源代码的源存储桶。这是管道的项目存储。每个管道都需要一个单独的构件存储,例如 S3 存储桶。当您创建或编辑管道时,管道区域中必须有一个构件桶,每个运行操作的 Amazon 区域也必须有一个构件桶。
有关更多信息,请参阅输入和输出构件和CodePipeline 管道结构参考。
选择下一步。
-
-
在步骤 3:添加源阶段中:
-
在源提供程序中,选择 Amazon CodeCommit。
-
在存储库名称中,选择您在 步骤 1:创建 CodeCommit 存储库 中创建的 CodeCommit 存储库的名称。
-
在分支名称中,选择包含最新的代码更新的分支的名称。
选择存储库名称和分支后,将会显示要为此管道创建的 Amazon CloudWatch Events 规则。
选择下一步。
-
-
在步骤 4:添加构建阶段中,选择跳过构建阶段,并通过再次选择跳过接受警告消息。
选择下一步。
-
在步骤 5:添加测试阶段中,选择跳过测试阶段,并通过再次选择跳过接受警告消息。
选择下一步。
-
在步骤 6:添加部署阶段中:
-
在操作名称中,选择部署。在部署提供程序中,选择 CloudFormation。
-
在操作模式中,选择创建或更新堆栈。
-
在堆栈名称中,为堆栈输入名称。这是模板将创建的堆栈的名称。
-
在输出文件名中,输入输出文件的名称,如
outputs。这是创建堆栈后由操作创建的文件的名称。 -
展开高级。在参数覆盖下,作为键值对输入模板覆盖。例如,此模板需要以下覆盖。
{ "DBClusterName": "MyDBCluster", "DBInstanceName": "MyDBInstance", "MasterUser": "UserName", "MasterPassword": "Password", "DBInstanceClass": "db.r4.large", "Purpose": "testing"}如果不输入覆盖,则模板会创建一个具有默认值的堆栈。
-
选择下一步。
-
在步骤 7:审核中,选择创建管道。您应该可以看到一个显示管道阶段的示意图。允许您的管道运行。您的两阶段管道已完成并准备好添加其他阶段。
-
步骤 3:添加 Amazon CloudFormation 部署操作以创建更改集
在管道中创建下一个操作,以允许 Amazon CloudFormation 在执行手动审批操作之前创建更改集。
-
在 https://console.aws.amazon.com/codepipeline/ 打开 CodePipeline 控制台。
在管道下,选择您的管道并选择查看。该图显示了您的管道源和部署阶段。
-
选择以编辑管道,或继续在编辑模式下显示管道。
-
选择以编辑部署阶段。
-
添加一个部署操作,该操作将为在上一个操作中创建的堆栈创建更改集。您可以在阶段中的现有操作之后添加此操作。
-
在操作名称中,输入 Change_Set。对于操作提供程序,选择 Amazon CloudFormation。
-
在输入构件中,选择 SourceArtifact。
-
在操作模式中,选择创建或替换更改集。
-
在堆栈名称中,如下所示输入变量语法。这是为其创建更改集的堆栈的名称,其中,向操作分配默认命名空间
DeployVariables。#{DeployVariables.StackName} -
在更改集名称中,输入更改集的名称。
my-changeset -
在参数覆盖中,将
Purpose参数从testing更改为production。{ "DBClusterName": "MyDBCluster", "DBInstanceName": "MyDBInstance", "MasterUser": "UserName", "MasterPassword": "Password", "DBInstanceClass": "db.r4.large", "Purpose": "production"} -
选择完成以保存操作。
-
步骤 4:添加手动审批操作
在管道中创建手动审批操作。
-
选择以编辑管道,或继续在编辑模式下显示管道。
-
选择以编辑部署阶段。
-
在创建更改集的部署操作之后添加手动审批操作。此操作允许您在管道执行更改集之前,验证在 Amazon CloudFormation 中创建的资源更改集。
步骤 5:添加 CloudFormation 部署操作以执行更改集
在管道中创建下一个操作,以允许 Amazon CloudFormation 在执行手动审批操作后执行更改集。
-
在 https://console.aws.amazon.com/codepipeline/ 打开 CodePipeline 控制台。
在管道下,选择您的管道并选择查看。该图显示了您的管道源和部署阶段。
-
选择以编辑管道,或继续在编辑模式下显示管道。
-
选择以编辑部署阶段。
-
添加将执行在上一个手动操作中审批的更改集的部署操作:
-
在操作名称中,输入 Execute_Change_Set。对于操作提供程序,选择 Amazon CloudFormation。
-
在输入构件中,选择 SourceArtifact。
-
在操作模式中,选择执行更改集。
-
在堆栈名称中,如下所示输入变量语法。这是为其创建更改集的堆栈的名称。
#{DeployVariables.StackName} -
在更改集名称中,输入您在上一个操作中创建的更改集的名称。
my-changeset -
选择完成以保存操作。
-
继续管道运行。
-
步骤 6:添加 CloudFormation 部署操作以删除堆栈
在管道中创建最终操作,以允许 Amazon CloudFormation 从输出文件中的变量获取堆栈名称并删除堆栈。
-
在 https://console.aws.amazon.com/codepipeline/ 打开 CodePipeline 控制台。
在管道下,选择您的管道并选择查看。该图显示了您的管道源和部署阶段。
-
选择以编辑管道。
-
选择以编辑部署阶段。
-
添加将删除堆栈的部署操作:
-
在操作名称中,选择 DeleteStack。在部署提供程序中,选择 CloudFormation。
-
在操作模式下,选 删除堆栈。
-
在堆栈名称中,如下所示输入变量语法。这是操作将删除的堆栈的名称。
-
选择完成以保存操作。
-
选择保存以保存管道。
管道在保存时运行。
-