使用Senza部署AWS CF模板的REST服务
项目描述
Lizzy
Lizzy是Senza的包装器:一个用于创建和执行AWSCloudFormation模板的命令行部署工具。使用Lizzy,自治团队可以在他们的持续交付管道中使用Senza,将新版本的应用部署到特定团队的AWS账户。Lizzy可以被部署到AWS账户,然后可以使用它的REST API将新应用部署到该账户。
为什么选择Lizzy
在Zalando,开发团队有自己的AWS账户,这样他们可以自主工作。一个团队(持续交付)负责维护所有其他Zalando团队的Jenkins。这使团队能够专注于他们的OKR,而不是花费时间配置Jenkins或创建自己的持续部署工具。对于Zalando,Lizzy帮助我们使用Jenkins-as-a-Service设置实现持续交付。如果没有Lizzy,团队需要将AWS凭证保存到他们的Jenkins实例中。
如果您的团队对在AWS上使用不可变基础设施感兴趣,您可以使用Senza来创建和管理您的堆栈,使用CloudFormation。Lizzy是一个额外的工具,它提供了一个部署API,用于在您的持续交付管道中运行Senza命令。Lizzy可以与任何代码集成工具(如Jenkins、TravisCI、CircleCI等)一起使用。
Lizzy是如何工作的
Lizzy由Lizzy Agent(一个REST API服务)和Lizzy-Client命令行工具组成。
Lizzy Agent是一个部署在团队AWS账户中的Web应用程序,并通过REST API获得创建新的CloudFormation堆栈的访问权限。所有请求都使用OAuth2载体令牌进行身份验证。
Lizzy-Client模仿了Senza命令的使用,并将它们转换为HTTP请求,然后发送到Lizzy Agent的REST API。
谁使用Lizzy
许多Zalando团队在生产中使用Lizzy来提供高质量的在线时尚平台,该平台是欧洲增长最快的。如果您想了解更多关于Zalando如何使用Lizzy的信息,请阅读我们的博客文章使用Lizzy的持续交付管道。
如何在本地运行Lizzy
此存储库包含一个Dockerfile,您可以使用以下命令在本地构建镜像
$ docker build -t lizzy:dev .
镜像构建完成后,它将以“lizzy:dev”标签可用。您还需要为Lizzy指定一些环境变量。以下是一个“example.cfg”文件
TOKEN_URL=https://token.auth.example.com/oauth2/access_token
TOKENINFO_URL=https://info.auth.example.com/oauth2/tokeninfo
ALLOWED_USERS=['robotusername','myusername']
DEPLOYER_SCOPE=deployer
LOG_LEVEL=DEBUG
您还需要在本地机器的~/.aws下配置AWS凭证。之后,您可以使用以下命令运行Lizzy镜像
$ docker run --rm -p 8080:8080 --env-file environment.cfg -v ~/.aws:/.aws --name lizzy -u 999 -it lizzy:dev
应用程序默认在端口8080上可用,通常在http://127.0.0.1:8080可访问。这取决于您如何在本地配置Docker。Swagger/OpenAPI控制台可在http://127.0.0.1:8080/api/ui/#/default访问。
部署到AWS
有几种方法可以将Lizzy部署到AWS。在Zalando,我们使用STUPS,它提供了一种方便且符合审计要求的平台即服务(PaaS)。以下是部署Lizzy的Senza定义示例
SenzaInfo:
StackName: lizzy
Parameters:
- ImageVersion:
Description: "Docker image version of lizzy."
SenzaComponents:
- Configuration:
Type: 'Senza::StupsAutoConfiguration'
- AppServer:
Type: Senza::TaupageAutoScalingGroup
AssociatePublicIpAddress: false
ElasticLoadBalancer: AppLoadBalancer
IamRoles: ['app-lizzy']
InstanceType: t2.nano
SecurityGroups: ['app-lizzy']
TaupageConfig:
application_version: '{{Arguments.ImageVersion}}'
environment:
ALLOWED_USER_PATTERN: "^(jenkins-slave-\\w+)$"
DEPLOYER_SCOPE: myscope
LANG: C.UTF-8
LC_ALL: C.UTF-8
LOG_LEVEL: DEBUG
REGION: '{{AccountInfo.Region}}'
TOKEN_URL: 'https://token.auth.example.com/oauth2/access_token'
TOKENINFO_URL: 'https://info.auth.example.com/oauth2/tokeninfo'
health_check_path: /api/swagger.json
ports: {8080: 8080}
runtime: Docker
source: 'lizzy:{{Arguments.ImageVersion}}'
- AppLoadBalancer:
HTTPPort: 8080
HealthCheckPath: /api/swagger.json
Scheme: internet-facing
SecurityGroups: ['app-lizzy-lb']
Type: Senza::WeightedDnsElasticLoadBalancer
Lizzy的访问控制
为了创建新的CloudFormation堆栈,Lizzy应用程序需要访问CloudFormation以及其他Amazon API中的某些服务。您需要指定类似于以下内容的IAM角色
{
"Statement": [
{
"Action": [
"iam:*",
"cloudformation:*",
"ec2:*",
"route53:*",
"elasticloadbalancing:*",
"cloudwatch:*",
"elasticache:*",
"acm:*",
"autoscaling:*",
"sqs:*"
],
"Effect": "Allow",
"Resource": "*"
}
],
"Version": "2012-10-17"
}
这就是Lizzy成功运行Senza命令所需的最小配置。此配置中可能包含其他语句。
配置
Lizzy使用以下环境变量进行配置
NAME |
DESCRIPTION |
DEFAULT |
---|---|---|
ALLOWED_USERS |
可以使用Lizzy的用户列表 |
|
ALLOWED_USER_PATTERN |
定义匹配Lizzy允许使用的用户名的正则表达式 |
|
DEPLOYER_SCOPE |
部署所需的OAuth作用域 |
|
LOG_LEVEL |
设置最小日志级别 |
INFO |
LOG_FORMAT |
设置日志格式(人类或默认) |
默认 |
REGION |
要使用的AWS区域 |
eu-west-1 |
SENTRY_DSN |
包含客户端密钥的Sentry URL |
|
TOKEN_URL |
获取新令牌的URL |
|
TOKENINFO_URL |
验证令牌的URL |
配置对Lizzy的访问
有两个环境变量用于配置谁可以成功调用Lizzy代理。您必须使用其中一个(并且仅使用一个):要么是ALLOWED_USERS,要么是ALLOWED_USER_PATTERN。要选择哪个适合您的用例,您首先需要了解它们的作用。
ALLOWED_USERS:可以访问Lizzy的特定用户名单。当您知道要授予访问权限的客户端的确切用户名时使用它。
ALLOWED_USER_PATTERN:应匹配将要调用Lizzy API的客户端用户名的正则表达式。当您知道用户名应以某些模式开头时使用它,例如stups_.+。
这些变量是互斥的。再次强调:只使用其中一个。
身份验证服务
TOKEN_URL环境变量应指向提供OAuth令牌的服务。在Zalando,我们使用开源的PlanB提供者。TOKENINFO_URL环境变量应指向存储令牌信息的服务的URL。为了存储OAuth2令牌信息,我们使用Zalando开发的PlanB令牌信息。如果您没有OAuth2基础设施,请查看这些项目。
为Lizzy做出贡献
我们欢迎您的想法、问题和pull请求。只需遵循通常/标准的GitHub实践。
许可证
版权所有2015 Zalando SE
根据Apache许可证第2版(“许可证”)许可;除非根据适用的法律或书面同意,否则不得使用此文件,除非遵守许可证。您可以在以下位置获得许可证副本:
https://apache.ac.cn/licenses/LICENSE-2.0
除非适用法律要求或书面同意,否则在许可证下分发的软件按“原样”基础分发,不提供任何明示或暗示的保证或条件。有关许可证的具体语言、权限和限制,请参阅许可证。
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。