使用 Pulumi 打造自己的多云管理平台

news2024/11/15 11:48:43

前言

在公有云技术与产品飞速发展的时代,业务对于其自身的可用性提出了越来越高的要求,当跨区域容灾已经无法满足业务需求的情况下,我们通常会考虑多云部署我们的业务平台,以规避更大规模的风险。但在多云平台部署的架构下,多云资源的管理成为了一个耗时耗力,管理与运维成本颇高的难点。这导致了第一,云管人员需要精通掌握两家甚至多家云厂商的技术与服务产品,或者第二,多支独立团队分别运维与管理导致的高团队成本等诸多痛点。所以公有云资源纳管平台(以下简称云管平台)应运而生。

亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏,看到这里请一定不要匆匆划过,点这里让它成为你的技术宝库!

云管平台简化了运管人员的操作流程,降低了公有云产品的技术门槛,但是在多云产品的集中式纳管上,却难度重重。其一,不同公有云厂商,使用独立的 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(运行时);

2.运行时。它会负责为您编写的程序做好运行准备,并在过程中监控程序的运行。

第二,资源提供方 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 的编码方式。

  1. 创建一个名称为 “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)

下面是一个稍微复杂一些的场景:

  1. 场景共由五个部分组成,第一部分,环境定义;第二部分,创建 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

https://www.pulumi.com/registry?trk=cndc-detail/

安装 Python3

https://docs.aws.amazon.com/zh_cn/parallelcluster/latest/ug/install-linux-python.html?trk=cndc-detail

安装或更新最新版本的 Amazon CLI

https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/getting-started-install.html?trk=cndc-detail

配置 Amazon CLI

https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-chap-configure.html?trk=cndc-detail

本篇作者

付晓明

亚马逊云解决方案架构师,负责云计算解决方案的咨询与架构设计,同时致力于数据库,边缘计算方面的研究和推广。在加入亚马逊云科技之前曾在金融行业 IT 部门负责互联网券商架构的设计,对分布式,高并发,中间件等具有丰富经验。

文章来源:

https://dev.amazoncloud.cn/column/article/6309e39986218f3ca3e8f81f?sc_channel=CSDN

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/391592.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

埃安自研版图扩至夸克电驱,动力研发团队已超1000人

埃安的三电自研版图正在扩大。3月3日&#xff0c;广汽集团旗下埃安发布了一项名为“夸克电驱”的技术产品&#xff0c;相比主流电驱体积减少一倍&#xff0c;同时电机功率密度比主流电驱增加了一倍。此前&#xff0c;比亚迪刚刚发布易四方动力系统&#xff0c;特斯拉也在投资者…

HTML常见标签

文章目录一、HTML基础标签注释标签标题标签段落标签换行标签格式化标签图片、音频、视频标签超链接标签列表标签表格标签布局标签表单标签表单标签概述form标签属性表单项标签综合案例一、HTML基础标签 基础标签就是和文字相关的标签 标签描述<h1> ~ <h6>定义标题…

【项目管理】晋升为领导后,如何开展工作?

兵随将转&#xff0c;作为管理者&#xff0c;你可以不知道下属的短处&#xff0c;却不能不知道下属的长处。晋升为领导后&#xff0c;如何开展工作呢&#xff1f; 金九银十&#xff0c;此期间换工作的人不在少数。有几位朋友最近都换了公司&#xff0c;职位得到晋升&#xff0c…

前端——1.相关概念

这篇文章主要介绍前端入门的相关概念 1.网页 1.1什么是网页&#xff1f; 网站&#xff1a;是指在因特网上根据一定的规则&#xff0c;使用HTML等制作的用于展示特定内容相关的网页集合 网页&#xff1a;是网站中的一“页”&#xff0c;通常是HTML格式的文件&#xff0c;它要…

JAVA后端部署项目三步走

1. JAVA部署项目三步走 1.1 查看 运行的端口 lsof -i:8804 &#xff08;8804 为端口&#xff09; 发现端口25111被监听 1.2 杀死进程,终止程序 pid 为进程号 kill -9 pid 1.3 后台运行jar包 nohup java -jar -Xms128M -Xmx256M -XX:MetaspaceSize128M -XX:MaxM…

C++笔记之lambda表达式

引言 Lambda表达式是从C 11版本引入的特性&#xff0c;利用它可以很方便的定义匿名函数对象&#xff0c;通常作为回调函数来使用。大家会经常拿它和函数指针&#xff0c;函数符放在一起比较&#xff0c;很多场合下&#xff0c;它们三者都可以替换着用。 语法 [ captures ] (…

javaScript基础面试题 ---宏任务微任务

宏任务微任务一、为什么JS是单线程语言&#xff1f;二、JS是单线程&#xff0c;怎样执行异步代码&#xff1f;1、JS是单线程语言 2、JS代码执行流程&#xff0c;同步执行完&#xff0c;再进行事件循环&#xff08;微任务、宏任务&#xff09; 3、清空所有的微任务&#xff0c;再…

机器学习100天(四十):040 线性支持向量机-公式推导

《机器学习100天》完整目录:目录 机器学习 100 天,今天讲的是:线性支持向量机-公式推导! 首先来看这样一个问题,在二维平面上需要找到一条直线划分正类和负类。 我们找到了 A、B、C 三条直线。这三条直线都能正确分类所有训练样本。但是,哪条直线最好呢?直观上来看,我…

代码随想录算法训练营第六天|242.有效的字母异位词 、349. 两个数组的交集 、 202. 快乐数、1. 两数之和

当我们遇到了要快速判断一个元素是否出现集合里的时候&#xff0c;就要考虑哈希法。哈希法是牺牲了空间换取了时间&#xff0c;要使用额外的数组&#xff0c;set或者是map来存放数据&#xff0c;才能实现快速的查找。当我们要使用集合来解决哈希问题的时候&#xff0c;优先使用…

【SpringCloud】SpringCloud教程之Nacos实战(1)

目录Nacos是什么&#xff1f;一.Nacos下载二.安装Nacos三.Nacos原理四.Nacos快速入门五.Nacos服务多级存储模式六.Nacos根据集群设置负载均衡1.根据同集群优先访问2.根据权重配置负载均衡七.Nacos的环境隔离八.Nacos和Eureka的区别前提&#xff1a;以订单服务和用户服务为例&am…

【C++基础入门】数组、函数

一&#xff1a;数组 1.1 概述 所谓数组&#xff0c;就是一个集合&#xff0c;里面存放了相同类型的数据元素 特点1&#xff1a; 数组中的每个数据元素都是相同的数据类型 特点2&#xff1a; 数组是由连续的内存位置组成的 1.2 一维数组 1.2.1 一维数组定义方式 一维数组…

世界那么大,你哪都别去了,来我带你了解CSS3 (二)

文章目录‍❤️‍&#x1f525;CSS文档流‍❤️‍&#x1f525;CSS浮动‍❤️‍&#x1f525;CSS定位‍❤️‍&#x1f525;CSS媒体查询‍❤️‍&#x1f525;CSS文档流 文档流是文档中可显示对象在排列时所占用的位置/空间。 例如&#xff1a;块元素自上而下摆放&#xff0c;内…

第一章---Pytorch快速入门---第一节---张量及运算

目录 1.1张量的数据类型 1.2 张量的生成 1.3 张量操作 1.4 张量的计算 一、张量 在高等数学中&#xff0c;单独的一个数是标量&#xff0c;而有序排列的一组数字是一个向量&#xff08;例如一个数组&#xff09;&#xff0c;向量组可以构成矩阵。向量是一维的&#xff0c;而…

Java——腐烂的橘子

题目链接 leetcode在线oj题——腐烂的橘子 题目描述 在给定的 m x n 网格 grid 中&#xff0c;每个单元格可以有以下三个值之一&#xff1a; 值 0 代表空单元格&#xff1b;值 1 代表新鲜橘子&#xff1b;值 2 代表腐烂的橘子。 每分钟&#xff0c;腐烂的橘子 周围 4 个方…

Python数据分析案例19——上市银行财务指标对比

我代码栏目都是针对基础的python数据分析人群&#xff0c;比如想写个本科毕业论文&#xff0c;课程论文&#xff0c;做个简单的案例分析等。过去写的案例可能使用了过多的机器学习和深度学习方法&#xff0c;文科的同学看不懂&#xff0c;可能他们仅仅只想用python做个回归或者…

Method breakpoints may dramatically slow down debugging 解决方案

项目无法启动了 简单介绍一下事情的过程&#xff1a;昨天在进行代码调试的时候&#xff0c;代码部分处理完成之后&#xff0c;启动debug模式的热部署准备测试一下逻辑&#xff0c;结果左下角提示我热部署失败&#xff0c;需要重新启动Tomcat才能再次调试&#xff0c;所以只得重…

spring之refresh流程-Java八股面试(六)

系列文章目录 第一章 ArrayList-Java八股面试(一) 第二章 HashMap-Java八股面试(二) 第三章 单例模式-Java八股面试(三) 第四章 线程池和Volatile关键字-Java八股面试(四) 第五章ConcurrentHashMap-Java八股面试(五) 动态每日更新算法题&#xff0c;想要学习的可以关注一下…

css中重难点整理(vertical-align)

一、vertical-align 在学习vertical-align的时候&#xff0c;可能会很困惑。即使网上有一大推文章讲veitical-align,感觉看完好像懂了&#xff0c;等自己布局的时候用到vertical-align的时候好像对它又很陌生。这就是我在布局的时候遇到的问题。 本来vertical-align就很不好理…

Spring——配置文件实现IOC和DI入门案例

现在先如图创建如下的Maven项目&#xff0c;在业务层和数据层分别写上对应的接口和实现类 在BookServiceImpl中创建一个BookDaoImpl对象&#xff0c;并调用里面的save()方法。 在测试类里面new一个bookservice的实现类&#xff0c;调用save()方法 输出如下图所示 要使用IOC容…

安全开发基础 -- DAST,SAST,IAST简单介绍

安全开发基础-- DAST&#xff0c;SAST&#xff0c;IAST 简介 DAST 动态应用程序安全测试&#xff08;Dynamic Application Security Testing&#xff09;技术在测试或运行阶段分析应用程序的动态运行状态。它模拟黑客行为对应用程序进行动态攻击&#xff0c;分析应用程序的反…