前语
在公有云技能与产品飞速发展的时代,事务关于其本身的可用性提出了越来越高的要求,当跨区域容灾现已无法满足事务需求的情况下,咱们通常会考虑多云布置咱们的事务渠道,以躲避更大规模的风险。但在多云渠道布置的架构下,多云资源的办理成为了一个耗时耗力,办理与运维本钱颇高的难点。这导致了榜首,云管人员需求通晓掌握两家乃至多家云厂商的技能与服务产品,或许第二,多支独立团队别离运维与办理导致的高团队本钱等许多痛点。所以公有云资源纳管渠道(以下简称云管渠道)应运而生。
亚马逊云科技开发者社区为开发者们供给全球的开发技能资源。这里有技能文档、开发事例、技能专栏、培训视频、活动与比赛等。帮助我国开发者对接国际最前沿技能,观点,和项目,并将我国优秀开发者或技能推荐给全球云社区。如果你还没有关注/收藏,看到这里请一定不要匆匆划过,点这里让它成为你的技能宝库! |
---|
云管渠道简化了运管人员的操作流程,降低了公有云产品的技能门槛,但是在多云产品的集中式纳管上,却难度重重。其一,不同公有云厂商,运用独立的 infrastructure-as-code (以下简称 IaC )体系或许服务,比如亚马逊云科技的 Cloudformation 服务;其二,不论云厂商仍是开源的 IaC 产品,均运用符号言语或许类符号言语编写代码,鲜有运用 Java, Python 或许 Golang 等开发言语的运行时,这关于通晓于开发言语的,云管渠道的开发人员导致了额定学习本钱,需求从0开始学习符号言语,往往会导致开发团队的冲突乃至拒绝;其三,符号言语运行过程中,更倾向于将整体仓库运行完毕之后,输出对应的 outputs,但在运行过程中,存在难以直接循环调用 outputs,无法写入数据库等许多难点,这增大了编写难度以及代码编写工作量。有没有一款产品,可以适配干流公有云 IaC,又可以运用高档编程言语编写代码呢?
什么是 Pulumi?
Pulumi 是非常盛行的,现代化 IaC 渠道。Pulumi 引入了干流编程言语,比如 JavaScript,Python,Java,Golang,.NET,以及符号言语 YAML,可以运用上述言语,经过 Pulumi SDK 办理不同云厂商的资源。Pulumi 现在现已支持了干流公有云厂商比如亚马逊云科技,微软 Azure,谷歌云与阿里云,及其生态比如 Fastly,Akamai,Cloudflare,Kubernetes,Kong,Apache Kafka 等。
Pulumi 的组成如下图所示:
每一个 Pulumi 项目包括至少一个程序组,程序组由编程言语书写,描述不同资源的运作

以下以 Python 代码为例,描述咱们在 Pulumi 中创立了 web-sg 名称安全组,并附加该安全组,以 ’ami-6869aa05’为镜像,创立了实例标准为 t2.micro 的 EC2 虚拟机。
import pulumi
import pulumi_aws as aws
group = aws.ec2.SecurityGroup('web-sg',
description='Enable HTTP access',
ingress=[
{ 'protocol': 'tcp', 'from_port': 80, 'to_port': 80, 'cidr_blocks': ['0.0.0.0/0'] }
])
server = aws.ec2.Instance('web-server',
ami='ami-6869aa05',
instance_type='t2.micro',
vpc_security_group_ids=[group.name]
)
pulumi.export('public_ip', server.public_ip)
pulumi.export('public_dns', server.public_dns)
Pulumi 怎么工作 Pulumi 的运作由几个部分组成:
榜首,言语处理中枢。Language Host 担任运行 Pulumi 的程序,并为您的开发言语准备好与之对应的环境,比如 Python3.7。言语中枢由两部分组成:
1.履行器。它会协助 Pulumi 准备并设置好相应的 Runtime(运行时);

第二,资源供给方 Provider。
资源供给方经过资源插件(Resource Plugin,用来办理资源)与原生 SDK 协作,来办理云端资源。
有了上述两部分组成,Engine 引擎就可以完成云端资源的办理。引擎现已被封装进 pulumi cli,无需额定装置与布置。
怎么创立一个 Pulumi 项目
1.装置 Pulumi(以 Linux 为例)
curl -fsSL https://get.pulumi.com | sh
2.装置运行时(以 Python 为例)
请阅览怎么在 Linux 上装置 Python3本文不再复述
3.装备权限
请阅览装置或更新最新版别的 Amazon CLI,完成 Amazon CLI 的装置,本文不再复述
请阅览装备 Amazon CLI完成完成权限装备,本文不再复述
4.创立新项目
$mkdir newproject && cd newproject
$pulumi new aws-python
Pulumi new 的指令行会经过交互式的方法,为您创立新的项目与新的仓库(stack),并装置好一切需求的组件(Module)。



5.布置这个项目
履行 pulumi up 进行项目布置

履行成功后,咱们可以在 S3 中看到有 pulumi 创立出来的 S3 桶

6.调整项目布置
咱们要在现已布置的项目中,做出一些调整。之前的布置完毕后,咱们创立了一个 S3 桶,这次咱们需求为其添加一个 index.html 并将其保管为静态站点
6.1创立站点主页
#touch index.html
在其间添加文本:
<html>
<body>
<h1>Hello, Amazon!</h1>
</body>
</html>
保存后,编辑__main__.py
在结尾处添加:
bucketObject = s3.BucketObject( ‘index.html’, bucket=bucket.id, source=pulumi.FileAsset(‘index.html’))
再次履行 pulumi up 改变布置

6.2 调整布置
这次咱们需求编辑 S3 bucket 的特点,使其保管静态站点,并调整 Bucket ACL,使其可以被匿名拜访。
编辑main.py
替换 bucket segment,使其成为:
bucket = s3.Bucket('my-bucket',
website=s3.BucketWebsiteArgs(
index_document="index.html",
))
在结尾处,添加输出:
pulumi.export('bucket_endpoint', pulumi.Output.concat('http://', bucket.website_endpoint))
履行 Pulumi up,发布项目改变后,得到输出结果:
Outputs:
+ bucketEndpoint: "http://my-bucket-e7bfd5a.s3-website-us-west-2.amazonaws.com"
bucketName : "my-bucket-e7bfd5a"
拜访 bucketEndpoint,咱们可以看到

7.销毁项目
咱们可以履行 pulumi destroy 销毁项目。

结论
经过这个简略的事例,咱们展示了经过 pulumi 可以轻松的创立,办理与删去一个项目,在项目中,咱们可以创立,调整,办理,删去与项目相关的 Resource,将 pulumi 与编程言语相结合,可以完成云管渠道的个性化需求,并经过云管渠道的几次点击,完成杂乱逻辑下,不同云服务的组合,满足事务场景的需求。
额定事例
咱们会额定供给几个 pulumi program,便利我们直观的了解到 pulumi 的编码方法。
- 创立一个名称为 “DocumentDBCluster”Amazon DocumentDB 的 Cluster,主动备份保存15天,必须敞开删去维护。然后将 DocumentDB Cluster Endpoint 输出。
import pulumi
import pulumi_aws as aws
docdb = aws.docdb.Cluster("docdb",
backup_retention_period=5,
cluster_identifier="DocumntDBCluster",
engine="docdb",
master_password="mustbeeightchars",
master_username="foo",
deletion_protection=True,
skip_final_snapshot=True)
pulumi.export('DocumentCluster_endpoint', docdb.endpoint)
下面是一个稍微杂乱一些的场景:
- 场景共由五个部分组成,榜首部分,环境定义;第二部分,创立 SSH&HTTP 的安全组,第三部分,创立 EC2 并附加 EIP,第四部分,创立 Aurora ServerlessV2,第五部分,输出。我们可以经过下列 python 代码与场景逐一对应。
import pulumi
import pulumi_aws as aws
config = pulumi.Config()
availability_zone = config.require("availabilityZone")
environment_type = config.get("environmentType")
if environment_type is None:
environment_type = "dev"
ami_id = config.get("amiID")
if ami_id is None:
ami_id = ""
ami_id_value = "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2" if ami_id == "" else aws.get_ssm_parameter_string().value
key_pair_name = config.require("keyPairName")
db_instance_identifier = config.get("dbInstanceIdentifier")
if db_instance_identifier is None:
db_instance_identifier = "mydatabase"
db_username = config.get("dbUsername")
if db_username is None:
db_username = "postgres"
db_password = config.require("dbPassword")
web_app_security_group = aws.ec2.SecurityGroup("webAppSecurityGroup",
name="webAppSG",
description="Allow HTTP/HTTPS and SSH inbound and outbound traffic",
ingress=[
aws.ec2.SecurityGroupIngressArgs(
ip_protocol="tcp",
from_port=80,
to_port=80,
cidr_ip="0.0.0.0/0",
),
aws.ec2.SecurityGroupIngressArgs(
ip_protocol="tcp",
from_port=443,
to_port=443,
cidr_ip="0.0.0.0/0",
),
aws.ec2.SecurityGroupIngressArgs(
ip_protocol="tcp",
from_port=22,
to_port=22,
cidr_ip="0.0.0.0/0",
),
])
web_app_instance = aws.ec2.Instance("webAppInstance",
availability_zone=availability_zone,
image_id=ami_id_value,
instance_type="t2.small",
key_name=key_pair_name,
security_groups=[web_app_security_group.id,default,])
web_app_eip = aws.ec2.EIP("webAppEIP",
vpc=True,
instance=web_app_instance.id)
web_app_database = aws.rds.Cluster("webAppDatabase",
cluster_identifier=db_instance_identifier,
engine="aurora-postgresql",
engine_mode="provisioned",
engine_version="13.6",
database_name=db_username,
master_username=db_username,
master_password=db_password,
serverlessv2_scaling_configuration=aws.rds.ClusterServerlessv2ScalingConfigurationArgs(
max_capacity=1,
min_capacity=0.5,
))
web_app_database_instance = aws.rds.ClusterInstance("webAppDatabaseInstance",
cluster_identifier=web_app_database.id,
instance_class="db.serverless",
engine=web_app_database.engine,
engine_version=web_app_database.engine_version)
pulumi.export("websiteURL", web_app_eip.id.apply(lambda id: f"http://{id}"))
pulumi.export("webServerPublicDNS", web_app_instance.public_dns_name)
pulumi.export("webAppDatabaseEndpoint", web_app_database.endpoint)
参阅资源:
了解 Pulumi 的 Registry
www.pulumi.com/registry/?t…
装置 Python3
docs.aws.amazon.com/zh_cn/paral…
装置或更新最新版别的 Amazon CLI
docs.aws.amazon.com/zh_cn/cli/l…
装备 Amazon CLI
docs.aws.amazon.com/zh_cn/cli/l…
本篇作者

付晓明
亚马逊云解决方案架构师,担任云计算解决方案的咨询与架构设计,一起致力于数据库,边缘计算方面的研讨和推广。在加入亚马逊云科技之前曾在金融职业 IT 部门担任互联网券商架构的设计,对分布式,高并发,中间件等具有丰富经验。
文章来历 :dev.amazoncloud.cn/column/arti…