AWS提供通过接口来控制的基础架构,叫作应用编程接口(application programming interface,API)。用户能通过API控制AWS的每一部分。用户可以使用大多数编程语言、命令行和更复杂的工具的SDK调用这些API。
在AWS上,一切操作都可以通过API来控制。用户通过HTTPS协议调用REST API来与AWS交互,如图
一切操作都可以通过API提供。例如,用户可以通过一个API调用启动一台服务器,创建1 TB存储,或通过API启动一个Hadoop集群。
要列出S3对象存储里的所有文件,可以向API端点发送一个GET请求:
GET / HTTP/1.1
Host: BucketName.s3.amazonaws.com
Authorization: [...]
DevOps(development operations)是软件开发驱动的一个方法,以便让开发和运维更加紧密地配合。其目标是能快速发布开发好的软件,并且没有损失质量。因而开发与运维的沟通与合作就变得必需了。
只有把代码修改和代码部署的过程完全自动化,才有可能在一天内部署多次代码。如果用户提交源代码到代码库中,源代码将被自动构建并使用自动化测试进行测试。如果构建结果通过了测试,它会自动安装到测试环境。接下来可能触发一些集成测试。集成测试通过后,这个更改会被传送入产品。但是这还不是流程的结束,现在用户还需要仔细监控系统并实时分析日志,以确保更改是成功的。
如果用户的基础架构是自动化的,用户可以为每一个提交到代码库的更改启动一个新系统,用来单独运行与同一时刻提交到代码库中的其他代码隔离的集成测试。任何时候有代码变动,将创建一个新系统(服务器、数据库和网络等)来单独运行这一变动。
为了易于详细理解基础架构即代码,人们开发了一种新语言来描述基础架构:JSON基础架构标记语言(JSON Infrastructure Markup Language,JIML)。
础架构包含以下内容:
负载均衡器(LB);
虚拟服务器;
数据库(DB);
DNS域名入口;
内容分发网络(CDN);
静态文件存储桶。
为了减少语法问题,我们让JIML基于JSON格式。代码清单4-1所示的JIML程序创建了图4-2所示的基础架构。$表示指向一个ID的引用。
用JIML描述基础架构
"region": "us-east-1",
"resources": [{
"type": "loadbalancer",
"id": "LB",
"config": {
"server": {
"cpu": 2,
"ram": 4,
"os": "ubuntu",
"waitFor": "$DB"
},
"servers": 2
}
}, {
"type": "cdn",
"id": "CDN",
"config": {
"defaultSource": "$LB",
"sources": [{
"path": "/static/ *", "source": "$BUCKET"
}]
}
}, {
"type": "database",
"id": "DB",
"config": {
"password": "***",
"engine": "MySQL"
}
}, {
"type": "dns",
"config": {
"from": "www.mydomain.com",
"to": "$CDN"
}
}, {
"type": "bucket",
"id": "BUCKET"
}]
}
伪语言命令翻译成AWS API调用——这里省略了。我们已经学习了基础架构即代码所需的一切:都与依赖相关。
现在我们理解了依赖关系对于基础架构即代码有多重要,让我们来看看如何使用命令行创建基础架构。命令行是实现基础架构即代码的一种工具。
JSON是怎么被转换成AWS API调用的呢?
(1)解析JSON输入。
(2)JIML解释器将资源和它们的依赖项连接起来,创建一张依赖图。
(3)JIML解释器从底层(叶子)到顶层(根)遍历依赖图中的树,然后产生一个线性的命令流。这些命令由一个伪语言来表达。
(4)然后JIML运行环境将这些伪语言的命令翻译成AWS API调用。
`基础设施即代码“基础架构即代码”表达了使用高级编程语言来控制IT系统的思想。在软件开发中,自动化测试、代码库和构建服务器提高了软件工程的质量。如果用户的基础架构可以当作代码来对待,用户就能够对自己的基础架构代码和自己的应用程序代码使用相同的技术。最终,用户将可以使用自动化测试、代码库和构建服务器来改善基础架构的质量。
不要混淆基础架构即代码与基础架构即服务(IaaS)的概念!IaaS指的是按照使用量进行付费的租用服务器、存储和网络的业务模式。