AWS OpsWorks 是一种应用程序管理服务,可以简化各种不同的任务,如软件配置、应用程序部署、扩展和监控等。CloudFormation 是一种资源管理服务,可用于管理 AWS OpsWorks 堆栈、层、应用程序和实例等 AWS OpsWorks 资源。
AWS OpsWorks 示例 PHP 应用程序
以下示例模板部署一个存储在公用 Git 存储库中的示例 AWS OpsWorks PHP Web 应用程序。该 AWS OpsWorks 堆栈包含两个应用程序服务器及一个负载均衡器,该负载均衡器用于在各服务器间均匀分布传入流量。该 AWS OpsWorks 堆栈还包含一个后端 MySQL 数据库服务器以存储数据。有关示例 AWS OpsWorks 应用程序的更多信息,请参阅《AWS OpsWorks 用户指南》中的演练:创建应用程序服务器堆栈以了解 AWSAWS OpsWorks 基础知识。
注意
ServiceRoleArn
和 DefaultInstanceProfileArn
属性引用在首次使用 AWS OpsWorks 后创建的 IAM 角色。
该示例定义了 MysqlRootPassword
参数,并将其 NoEcho
属性设置为 true
。如果您将 NoEcho
属性设置为 true
,则对于描述堆栈或堆栈事件的任何调用,CloudFormation 返回使用星号 (*****) 遮蔽的参数值。
重要
我们建议不要将敏感信息直接嵌入 CloudFormation 模板中,而应使用堆栈模板中的动态参数来引用在 CloudFormation 外部存储和管理的敏感信息,例如 AWS Systems Manager Parameter Store 或 AWS Secrets Manager 中的敏感信息。
有关更多信息,请参阅 请勿将凭证嵌入您的模板 最佳实践。
JSON
{
"AWSTemplateFormatVersion": "2010-09-09",
"Parameters": {
"ServiceRole": {
"Default": "aws-opsworks-service-role",
"Description": "The OpsWorks service role",
"Type": "String",
"MinLength": "1",
"MaxLength": "64",
"AllowedPattern": "[a-zA-Z][a-zA-Z0-9-]*",
"ConstraintDescription": "must begin with a letter and contain only alphanumeric characters."
},
"InstanceRole": {
"Default": "aws-opsworks-ec2-role",
"Description": "The OpsWorks instance role",
"Type": "String",
"MinLength": "1",
"MaxLength": "64",
"AllowedPattern": "[a-zA-Z][a-zA-Z0-9-]*",
"ConstraintDescription": "must begin with a letter and contain only alphanumeric characters."
},
"AppName": {
"Default": "myapp",
"Description": "The app name",
"Type": "String",
"MinLength": "1",
"MaxLength": "64",
"AllowedPattern": "[a-zA-Z][a-zA-Z0-9]*",
"ConstraintDescription": "must begin with a letter and contain only alphanumeric characters."
},
"MysqlRootPassword" : {
"Description" : "MysqlRootPassword",
"NoEcho" : "true",
"Type" : "String"
}
},
"Resources": {
"myStack": {
"Type": "AWS::OpsWorks::Stack",
"Properties": {
"Name": {
"Ref": "AWS::StackName"
},
"ServiceRoleArn": {
"Fn::Join": [
"", ["arn:aws:iam::", {"Ref": "AWS::AccountId"},
":role/", {"Ref": "ServiceRole"}]
]
},
"DefaultInstanceProfileArn": {
"Fn::Join": [
"", ["arn:aws:iam::", {"Ref": "AWS::AccountId"},
":instance-profile/", {"Ref": "InstanceRole"}]
]
},
"UseCustomCookbooks": "true",
"CustomCookbooksSource": {
"Type": "git",
"Url": "git://github.com/amazonwebservices/opsworks-example-cookbooks.git"
}
}
},
"myLayer": {
"Type": "AWS::OpsWorks::Layer",
"DependsOn": "myApp",
"Properties": {
"StackId": {"Ref": "myStack"},
"Type": "php-app",
"Shortname" : "php-app",
"EnableAutoHealing" : "true",
"AutoAssignElasticIps" : "false",
"AutoAssignPublicIps" : "true",
"Name": "MyPHPApp",
"CustomRecipes" : {
"Configure" : ["phpapp::appsetup"]
}
}
},
"DBLayer" : {
"Type" : "AWS::OpsWorks::Layer",
"DependsOn": "myApp",
"Properties" : {
"StackId" : {"Ref":"myStack"},
"Type" : "db-master",
"Shortname" : "db-layer",
"EnableAutoHealing" : "true",
"AutoAssignElasticIps" : "false",
"AutoAssignPublicIps" : "true",
"Name" : "MyMySQL",
"CustomRecipes" : {
"Setup" : ["phpapp::dbsetup"]
},
"Attributes" : {
"MysqlRootPassword" : {"Ref":"MysqlRootPassword"},
"MysqlRootPasswordUbiquitous": "true"
},
"VolumeConfigurations":[{"MountPoint":"/vol/mysql","NumberOfDisks":1,"Size":10}]
}
},
"ELBAttachment" : {
"Type" : "AWS::OpsWorks::ElasticLoadBalancerAttachment",
"Properties" : {
"ElasticLoadBalancerName" : { "Ref" : "ELB" },
"LayerId" : { "Ref" : "myLayer" }
}
},
"ELB" : {
"Type": "AWS::ElasticLoadBalancing::LoadBalancer",
"Properties": {
"AvailabilityZones": { "Fn::GetAZs" : "" } ,
"Listeners": [{
"LoadBalancerPort": "80",
"InstancePort": "80",
"Protocol": "HTTP",
"InstanceProtocol": "HTTP"
}],
"HealthCheck": {
"Target": "HTTP:80/",
"HealthyThreshold": "2",
"UnhealthyThreshold": "10",
"Interval": "30",
"Timeout": "5"
}
}
},
"myAppInstance1": {
"Type": "AWS::OpsWorks::Instance",
"Properties": {
"StackId": {"Ref": "myStack"},
"LayerIds": [{"Ref": "myLayer"}],
"InstanceType": "m1.small"
}
},
"myAppInstance2": {
"Type": "AWS::OpsWorks::Instance",
"Properties": {
"StackId": {"Ref": "myStack"},
"LayerIds": [{"Ref": "myLayer"}],
"InstanceType": "m1.small"
}
},
"myDBInstance": {
"Type": "AWS::OpsWorks::Instance",
"Properties": {
"StackId": {"Ref": "myStack"},
"LayerIds": [{"Ref": "DBLayer"}],
"InstanceType": "m1.small"
}
},
"myApp" : {
"Type" : "AWS::OpsWorks::App",
"Properties" : {
"StackId" : {"Ref":"myStack"},
"Type" : "php",
"Name" : {"Ref": "AppName"},
"AppSource" : {
"Type" : "git",
"Url" : "git://github.com/amazonwebservices/opsworks-demo-php-simple-app.git",
"Revision" : "version2"
},
"Attributes" : {
"DocumentRoot" : "web"
}
}
}
}
}
YAML
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
ServiceRole:
Default: aws-opsworks-service-role
Description: The OpsWorks service role
Type: String
MinLength: '1'
MaxLength: '64'
AllowedPattern: "[a-zA-Z][a-zA-Z0-9-]*"
ConstraintDescription: must begin with a letter and contain only alphanumeric
characters.
InstanceRole:
Default: aws-opsworks-ec2-role
Description: The OpsWorks instance role
Type: String
MinLength: '1'
MaxLength: '64'
AllowedPattern: "[a-zA-Z][a-zA-Z0-9-]*"
ConstraintDescription: must begin with a letter and contain only alphanumeric
characters.
AppName:
Default: myapp
Description: The app name
Type: String
MinLength: '1'
MaxLength: '64'
AllowedPattern: "[a-zA-Z][a-zA-Z0-9]*"
ConstraintDescription: must begin with a letter and contain only alphanumeric
characters.
MysqlRootPassword:
Description: MysqlRootPassword
NoEcho: 'true'
Type: String
Resources:
myStack:
Type: AWS::OpsWorks::Stack
Properties:
Name:
Ref: AWS::StackName
ServiceRoleArn: !Sub "arn:aws:iam::${AWS::AccountId}:role/${ServiceRole}"
DefaultInstanceProfileArn: !Sub "arn:aws:iam::${AWS::AccountId}:instance-profile/${InstanceRole}"
UseCustomCookbooks: 'true'
CustomCookbooksSource:
Type: git
Url: git://github.com/amazonwebservices/opsworks-example-cookbooks.git
myLayer:
Type: AWS::OpsWorks::Layer
DependsOn: myApp
Properties:
StackId:
Ref: myStack
Type: php-app
Shortname: php-app
EnableAutoHealing: 'true'
AutoAssignElasticIps: 'false'
AutoAssignPublicIps: 'true'
Name: MyPHPApp
CustomRecipes:
Configure:
- phpapp::appsetup
DBLayer:
Type: AWS::OpsWorks::Layer
DependsOn: myApp
Properties:
StackId:
Ref: myStack
Type: db-master
Shortname: db-layer
EnableAutoHealing: 'true'
AutoAssignElasticIps: 'false'
AutoAssignPublicIps: 'true'
Name: MyMySQL
CustomRecipes:
Setup:
- phpapp::dbsetup
Attributes:
MysqlRootPassword:
Ref: MysqlRootPassword
MysqlRootPasswordUbiquitous: 'true'
VolumeConfigurations:
- MountPoint: "/vol/mysql"
NumberOfDisks: 1
Size: 10
ELBAttachment:
Type: AWS::OpsWorks::ElasticLoadBalancerAttachment
Properties:
ElasticLoadBalancerName:
Ref: ELB
LayerId:
Ref: myLayer
ELB:
Type: AWS::ElasticLoadBalancing::LoadBalancer
Properties:
AvailabilityZones:
Fn::GetAZs: ''
Listeners:
- LoadBalancerPort: '80'
InstancePort: '80'
Protocol: HTTP
InstanceProtocol: HTTP
HealthCheck:
Target: HTTP:80/
HealthyThreshold: '2'
UnhealthyThreshold: '10'
Interval: '30'
Timeout: '5'
myAppInstance1:
Type: AWS::OpsWorks::Instance
Properties:
StackId:
Ref: myStack
LayerIds:
- Ref: myLayer
InstanceType: m1.small
myAppInstance2:
Type: AWS::OpsWorks::Instance
Properties:
StackId:
Ref: myStack
LayerIds:
- Ref: myLayer
InstanceType: m1.small
myDBInstance:
Type: AWS::OpsWorks::Instance
Properties:
StackId:
Ref: myStack
LayerIds:
- Ref: DBLayer
InstanceType: m1.small
myApp:
Type: AWS::OpsWorks::App
Properties:
StackId:
Ref: myStack
Type: php
Name:
Ref: AppName
AppSource:
Type: git
Url: git://github.com/amazonwebservices/opsworks-demo-php-simple-app.git
Revision: version2
Attributes:
DocumentRoot: web