如何通过 cloudformation 部署 opsworks 应用程序?
How to deploy an opsworks application by cloudformation?
在 cloudformation 模板中,我创建了一个 opsworks 堆栈、一个层、一个实例和一个应用程序。该模板通过食谱和脚本的厨师食谱设置和配置实例。如何在不手动单击堆栈内部署的情况下从模板自动部署应用程序?部署后,正在执行说明书中定义的 Deloy 配方:
"MyLayer": {
"Type": "AWS::OpsWorks::Layer",
"DependsOn" : "OpsWorksServiceRole",
"Properties": {
"AutoAssignElasticIps" : false,
"AutoAssignPublicIps" : true,
"CustomRecipes" : {
"Setup" : ["cassandra::setup","awscli::setup","settings::setup"],
"Deploy": ["imports::deploy"]
},
"CustomSecurityGroupIds" : { "Ref" : "SecurityGroupIds" },
"EnableAutoHealing" : true,
"InstallUpdatesOnBoot": false,
"LifecycleEventConfiguration": {
"ShutdownEventConfiguration": {
"DelayUntilElbConnectionsDrained": false,
"ExecutionTimeout": 120 }
},
"Name": "script-node",
"Shortname" : "node",
"StackId": { "Ref": "MyStack" },
"Type": "custom",
"UseEbsOptimizedInstances": true,
"VolumeConfigurations": [ {
"Iops": 10000,
"MountPoint": "/dev/sda1",
"NumberOfDisks": 1,
"Size": 20,
"VolumeType": "gp2"
}]
}
}
应用程序如下所示:
有什么想法吗?
谢谢。
我相信这可以在食谱中完成。因此,在您的食谱中,您将有一个功能来验证应用程序名称,如果它存在,则继续部署。
例如,您的部署配方如下所示:
if validator(node[:app][:name]) == true
do whatever
end
并且此验证器函数可以驻留在您的 Chef 库中:
def validator(app_name)
app = search("aws_opsworks_app", "name:#{app_name}").first
if app[:deploy] == true
Chef::Log.warn("PROCEEDING: Deploy initiated for #{app[:name]}")
end
end
CreateDeployment
API 调用会生成一个一次性事件,该事件会在您的 OpsWorks 堆栈中执行 Deploy
操作。我不认为任何官方 CloudFormation 资源直接映射到此,但这里有一些关于如何在 CloudFormation 模板的上下文中调用它的想法:
- 编写一个 Custom Resource,在创建时调用 CreateDeployment(例如,通过 Node.js 的 AWS SDK)。
- 为有关此集成的文档添加
AWS::CodePipeline::Pipeline
resource to your template that's configured to deploy your OpsWorks app as part of a Deploy Stage. See Using AWS CodePipeline with AWS OpsWorks Stacks。 (虽然它是一个额外的服务 + 复杂层,但我认为 CodePipeline 是一个更好的抽象层,用于在您的应用程序堆栈中建模部署操作。)
在 cloudformation 模板中,我创建了一个 opsworks 堆栈、一个层、一个实例和一个应用程序。该模板通过食谱和脚本的厨师食谱设置和配置实例。如何在不手动单击堆栈内部署的情况下从模板自动部署应用程序?部署后,正在执行说明书中定义的 Deloy 配方:
"MyLayer": {
"Type": "AWS::OpsWorks::Layer",
"DependsOn" : "OpsWorksServiceRole",
"Properties": {
"AutoAssignElasticIps" : false,
"AutoAssignPublicIps" : true,
"CustomRecipes" : {
"Setup" : ["cassandra::setup","awscli::setup","settings::setup"],
"Deploy": ["imports::deploy"]
},
"CustomSecurityGroupIds" : { "Ref" : "SecurityGroupIds" },
"EnableAutoHealing" : true,
"InstallUpdatesOnBoot": false,
"LifecycleEventConfiguration": {
"ShutdownEventConfiguration": {
"DelayUntilElbConnectionsDrained": false,
"ExecutionTimeout": 120 }
},
"Name": "script-node",
"Shortname" : "node",
"StackId": { "Ref": "MyStack" },
"Type": "custom",
"UseEbsOptimizedInstances": true,
"VolumeConfigurations": [ {
"Iops": 10000,
"MountPoint": "/dev/sda1",
"NumberOfDisks": 1,
"Size": 20,
"VolumeType": "gp2"
}]
}
}
应用程序如下所示:
有什么想法吗? 谢谢。
我相信这可以在食谱中完成。因此,在您的食谱中,您将有一个功能来验证应用程序名称,如果它存在,则继续部署。
例如,您的部署配方如下所示:
if validator(node[:app][:name]) == true
do whatever
end
并且此验证器函数可以驻留在您的 Chef 库中:
def validator(app_name)
app = search("aws_opsworks_app", "name:#{app_name}").first
if app[:deploy] == true
Chef::Log.warn("PROCEEDING: Deploy initiated for #{app[:name]}")
end
end
CreateDeployment
API 调用会生成一个一次性事件,该事件会在您的 OpsWorks 堆栈中执行 Deploy
操作。我不认为任何官方 CloudFormation 资源直接映射到此,但这里有一些关于如何在 CloudFormation 模板的上下文中调用它的想法:
- 编写一个 Custom Resource,在创建时调用 CreateDeployment(例如,通过 Node.js 的 AWS SDK)。
- 为有关此集成的文档添加
AWS::CodePipeline::Pipeline
resource to your template that's configured to deploy your OpsWorks app as part of a Deploy Stage. See Using AWS CodePipeline with AWS OpsWorks Stacks。 (虽然它是一个额外的服务 + 复杂层,但我认为 CodePipeline 是一个更好的抽象层,用于在您的应用程序堆栈中建模部署操作。)