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

0
0
{"value":"### **前言**\n在公有云技术与产品飞速发展的时代,业务对于其自身的可用性提出了越来越高的要求,当跨区域容灾已经无法满足业务需求的情况下,我们通常会考虑多云部署我们的业务平台,以规避更大规模的风险。但在多云平台部署的架构下,多云资源的管理成为了一个耗时耗力,管理与运维成本颇高的难点。这导致了第一,云管人员需要精通掌握两家甚至多家云厂商的技术与服务产品,或者第二,多支独立团队分别运维与管理导致的高团队成本等诸多痛点。所以公有云资源纳管平台(以下简称云管平台)应运而生。\n\n云管平台简化了运管人员的操作流程,降低了公有云产品的技术门槛,但是在多云产品的集中式纳管上,却难度重重。其一,不同公有云厂商,使用独立的 infrastructure-as-code (以下简称 IaC )体系或者服务,譬如亚马逊云科技的 Cloudformation 服务;其二,不论云厂商还是开源的 IaC 产品,均使用标记语言或者类标记语言编写代码,鲜有使用 Java, Python 或者 Golang 等开发语言的运行时,这对于精通于开发语言的,云管平台的开发人员导致了额外学习成本,需要从0开始学习标记语言,往往会导致开发团队的抵触甚至拒绝;其三,标记语言运行过程中,更倾向于将整体堆栈运行完毕之后,输出对应的 outputs,但在运行过程中,存在难以直接循环调用 outputs,无法写入数据库等诸多难点,这增大了编写难度以及代码编写工作量。有没有一款产品,能够适配主流公有云 IaC,又可以使用高级编程语言编写代码呢?\n\n### **什么是 Pulumi?**\nPulumi 是非常流行的,现代化 IaC \n 平台。Pulumi 引入了主流编程语言,譬如 JavaScript,Python,Java,Golang,.NET,以及标记语言 YAML,可以使用上述语言,通过 Pulumi SDK 管理不同云厂商的资源。Pulumi 目前已经支持了主流公有云厂商譬如亚马逊云科技,微软 Azure,谷歌云与阿里云,及其生态譬如 Fastly,Akamai,Cloudflare,Kubernetes,Kong,Apache Kafka 等。\n\nPulumi 的组成如下图所示:\n\n每一个 Pulumi 项目包含至少一个程序组,程序组由编程语言书写,描述不同资源的运作\n\n![image.png](https://dev-media.amazoncloud.cn/d07d3d9bc98f4f779bd827dfcd1947b0_image.png)\n\n以及彼此之间的关系。\n\n以下以 Python 代码为例,描述我们在 Pulumi 中创建了 web-sg 名称安全组,并附加该安全组,以 ’ami-6869aa05’为镜像,创建了实例规格为 t2.micro 的 EC2 虚拟机。\n\n```\\nimport pulumi\\nimport pulumi_aws as aws\\n\\ngroup = aws.ec2.SecurityGroup('web-sg',\\n description='Enable HTTP access',\\n ingress=[\\n { 'protocol': 'tcp', 'from_port': 80, 'to_port': 80, 'cidr_blocks': ['0.0.0.0/0'] }\\n ])\\n\\nserver = aws.ec2.Instance('web-server',\\n ami='ami-6869aa05',\\n instance_type='t2.micro',\\n vpc_security_group_ids=[group.name] \\n)\\n\\npulumi.export('public_ip', server.public_ip)\\npulumi.export('public_dns', server.public_dns)\\n```\n\nPulumi 如何工作\nPulumi 的运作由几个部分组成:\n\n第一,语言处理中枢。Language Host 负责运行 Pulumi 的程序,并为您的开发语言准备好与之对应的环境,譬如 Python3.7。语言中枢由两部分组成:\n\n1.执行器。它会协助 Pulumi 准备并设置好相应的 Runtime(运行时);\n\n![image.png](https://dev-media.amazoncloud.cn/6a17e88aa72a43afa72d1fd2c3be5bbe_image.png)\n\n2.运行时。它会负责为您编写的程序做好运行准备,并在过程中监控程序的运行。\n\n第二,资源提供方 Provider。\n\n资源提供方通过资源插件(Resource Plugin,用来管理资源)与原生 SDK 协作,来管理云端资源。\n\n有了上述两部分组成,Engine 引擎就可以实现云端资源的管理。引擎已经被封装进 pulumi cli,无需额外安装与部署。\n\n#### **如何创建一个 Pulumi 项目**\n\n1.安装 Pulumi(以 Linux 为例)\n\n```\\ncurl -fsSL https://get.pulumi.com | sh\\n```\n\n2.安装运行时(以 Python 为例)\n\n请阅读 [如何在 Linux 上安装 Python3](https://docs.aws.amazon.com/zh_cn/parallelcluster/latest/ug/install-linux-python.html) 本文不再复述\n\n3.配置权限\n\n请阅读 [安装或更新最新版本的 Amazon CLI](https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/getting-started-install.html) ,完成 Amazon CLI 的安装,本文不再复述\n\n请阅读 [配置 Amazon CLI](https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-chap-configure.html) 完成完成权限配置,本文不再复述\n\n4.创建新项目\n\n```\\n\$mkdir newproject && cd newproject\\n\$pulumi new aws-python\\n```\n\nPulumi new 的命令行会通过交互式的方式,为您创建新的项目与新的堆栈(stack),并安装好所有需要的组件(Module)。\n\n![image.png](https://dev-media.amazoncloud.cn/3779311d91cd4f3da8f88cbaeadf8e2f_image.png)\n\n![image.png](https://dev-media.amazoncloud.cn/ee87c7c8ed8945028bed9d9d77a6899e_image.png)\n\n![image.png](https://dev-media.amazoncloud.cn/d4c666c6561d4c13910844e0b83b5d37_image.png)\n\n5.部署这个项目\n\n执行 pulumi up 进行项目部署\n\n![image.png](https://dev-media.amazoncloud.cn/b1ee00bb315e4916b96aac20d4a5d626_image.png)\n\n执行成功后,我们可以在 S3 中看到有 pulumi 创建出来的 S3 桶\n\n![image.png](https://dev-media.amazoncloud.cn/88a7c2f4056b4599afaea4933e28f292_image.png)\n\n6.调整项目部署\n\n我们要在已经部署的项目中,做出一些调整。之前的部署结束后,我们创建了一个 S3 桶,这次我们需要为其添加一个 index.html 并将其托管为静态站点\n\n6.1创建站点首页\n\n```\\n#touch index.html\\n```\n\n在其中添加文本:\n\n```\\n<html>\\n <body>\\n <h1>Hello, Amazon!</h1>\\n </body>\\n</html>\\n```\n\n保存后,编辑__main__.py\n\n在结尾处添加:\n\nbucketObject = s3.BucketObject( ‘index.html’, bucket=bucket.id, source=pulumi.FileAsset(‘index.html’))\n\n再次执行 pulumi up 变更部署\n\n![image.png](https://dev-media.amazoncloud.cn/882c66868096444cb44c8de629974f1e_image.png)\n\n6.2 调整部署\n\n这次我们需要编辑 S3 bucket 的属性,使其托管静态站点,并调整 Bucket ACL,使其可以被匿名访问。\n\n编辑 __main__.py\n\n替换 bucket segment,使其成为:\n\n```\\nbucket = s3.Bucket('my-bucket',\\n website=s3.BucketWebsiteArgs(\\n index_document=\\"index.html\\",\\n))\\n```\n\n在结尾处,增加输出:\n\n```\\npulumi.export('bucket_endpoint', pulumi.Output.concat('http://', bucket.website_endpoint))\\n```\n\n执行 Pulumi up,发布项目变更后,得到输出结果:\n\n```\\nOutputs:\\n + bucketEndpoint: \\"http://my-bucket-e7bfd5a.s3-website-us-west-2.amazonaws.com\\"\\n bucketName : \\"my-bucket-e7bfd5a\\"\\n```\n\n访问 bucketEndpoint,我们可以看到\n\n![image.png](https://dev-media.amazoncloud.cn/dc84e75378c843ac86b0aa1de46125a0_image.png)\n\n7.销毁项目\n\n我们可以执行 pulumi destroy 销毁项目。\n\n![image.png](https://dev-media.amazoncloud.cn/360f5373dd2c47e8bbfbaaefe96c2991_image.png)\n\n### **结论**\n通过这个简单的案例,我们展示了通过 pulumi 可以轻松的创建,管理与删除一个项目,在项目中,我们可以创建,调整,管理,删除与项目相关的 Resource,将 pulumi 与编程语言相结合,可以实现云管平台的个性化需求,并通过云管平台的几次点击,实现复杂逻辑下,不同云服务的组合,满足业务场景的需求。\n\n#### **额外案例**\n\n我们会额外提供几个 pulumi program,方便大家直观的了解到 pulumi 的编码方式。\n\n1. 创建一个名称为 “DocumentDBCluster”[Amazon DocumentDB](https://aws.amazon.com/cn/documentdb/?trk=cndc-detail) 的 Cluster,自动备份保存15天,必须开启删除保护。然后将 DocumentDB Cluster Endpoint 输出。\n\n```\\nimport pulumi\\nimport pulumi_aws as aws\\n\\ndocdb = aws.docdb.Cluster(\\"docdb\\",\\n backup_retention_period=5,\\n cluster_identifier=\\"DocumntDBCluster\\",\\n engine=\\"docdb\\",\\n master_password=\\"mustbeeightchars\\",\\n master_username=\\"foo\\",\\n deletion_protection=True,\\n skip_final_snapshot=True)\\npulumi.export('DocumentCluster_endpoint', docdb.endpoint)\\n```\n\n下面是一个稍微复杂一些的场景:\n\n2. 场景共由五个部分组成,第一部分,环境定义;第二部分,创建 SSH&HTTP 的安全组,第三部分,创建 EC2 并附加 EIP,第四部分,创建 Aurora ServerlessV2,第五部分,输出。大家能够通过下列 python 代码与场景逐一对应。\n\n```\\nimport pulumi\\nimport pulumi_aws as aws\\n\\nconfig = pulumi.Config()\\navailability_zone = config.require(\\"availabilityZone\\")\\nenvironment_type = config.get(\\"environmentType\\")\\nif environment_type is None:\\n environment_type = \\"dev\\"\\nami_id = config.get(\\"amiID\\")\\nif ami_id is None:\\n ami_id = \\"\\"\\nami_id_value = \\"/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2\\" if ami_id == \\"\\" else aws.get_ssm_parameter_string().value\\nkey_pair_name = config.require(\\"keyPairName\\")\\ndb_instance_identifier = config.get(\\"dbInstanceIdentifier\\")\\nif db_instance_identifier is None:\\n db_instance_identifier = \\"mydatabase\\"\\ndb_username = config.get(\\"dbUsername\\")\\nif db_username is None:\\n db_username = \\"postgres\\"\\ndb_password = config.require(\\"dbPassword\\")\\n\\nweb_app_security_group = aws.ec2.SecurityGroup(\\"webAppSecurityGroup\\",\\n name=\\"webAppSG\\",\\n description=\\"Allow HTTP/HTTPS and SSH inbound and outbound traffic\\",\\n ingress=[\\n aws.ec2.SecurityGroupIngressArgs(\\n ip_protocol=\\"tcp\\",\\n from_port=80,\\n to_port=80,\\n cidr_ip=\\"0.0.0.0/0\\",\\n ),\\n aws.ec2.SecurityGroupIngressArgs(\\n ip_protocol=\\"tcp\\",\\n from_port=443,\\n to_port=443,\\n cidr_ip=\\"0.0.0.0/0\\",\\n ),\\n aws.ec2.SecurityGroupIngressArgs(\\n ip_protocol=\\"tcp\\",\\n from_port=22,\\n to_port=22,\\n cidr_ip=\\"0.0.0.0/0\\",\\n ),\\n])\\n\\nweb_app_instance = aws.ec2.Instance(\\"webAppInstance\\",\\n availability_zone=availability_zone,\\n image_id=ami_id_value,\\n instance_type=\\"t2.small\\",\\n key_name=key_pair_name,\\n security_groups=[web_app_security_group.id,default,])\\nweb_app_eip = aws.ec2.EIP(\\"webAppEIP\\",\\n vpc=True,\\ninstance=web_app_instance.id)\\n\\nweb_app_database = aws.rds.Cluster(\\"webAppDatabase\\",\\n cluster_identifier=db_instance_identifier,\\n engine=\\"aurora-postgresql\\",\\n engine_mode=\\"provisioned\\",\\n engine_version=\\"13.6\\",\\n database_name=db_username,\\n master_username=db_username,\\n master_password=db_password,\\n serverlessv2_scaling_configuration=aws.rds.ClusterServerlessv2ScalingConfigurationArgs(\\n max_capacity=1,\\n min_capacity=0.5,\\n ))\\nweb_app_database_instance = aws.rds.ClusterInstance(\\"webAppDatabaseInstance\\",\\n cluster_identifier=web_app_database.id,\\n instance_class=\\"db.serverless\\",\\n engine=web_app_database.engine,\\n engine_version=web_app_database.engine_version)\\n\\npulumi.export(\\"websiteURL\\", web_app_eip.id.apply(lambda id: f\\"http://{id}\\"))\\npulumi.export(\\"webServerPublicDNS\\", web_app_instance.public_dns_name)\\npulumi.export(\\"webAppDatabaseEndpoint\\", web_app_database.endpoint)\\n```\n\n### **参考资源:**\n了解 Pulumi 的 Registry\n\n[https://www.pulumi.com/registry/](https://www.pulumi.com/registry/)\n\n安装 Python3\n\n[https://docs.aws.amazon.com/zh_cn/parallelcluster/latest/ug/install-linux-python.html](https://docs.aws.amazon.com/zh_cn/parallelcluster/latest/ug/install-linux-python.html)\n\n安装或更新最新版本的 Amazon CLI\n\n[https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/getting-started-install.html](https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/getting-started-install.html)\n\n配置 Amazon CLI\n\n[https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-chap-configure.html](https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-chap-configure.html)\n\n### **本篇作者**\n\n![image.png](https://dev-media.amazoncloud.cn/a2a299df4ba649c787929b32fc12d17e_image.png)\n\n#### **付晓明**\n\n亚马逊云解决方案架构师,负责云计算解决方案的咨询与架构设计,同时致力于数据库,边缘计算方面的研究和推广。在加入亚马逊云科技之前曾在金融行业 IT 部门负责互联网券商架构的设计,对分布式,高并发,中间件等具有丰富经验。\n","render":"<h3><a id=\\"_0\\"></a><strong>前言</strong></h3>\\n<p>在公有云技术与产品飞速发展的时代,业务对于其自身的可用性提出了越来越高的要求,当跨区域容灾已经无法满足业务需求的情况下,我们通常会考虑多云部署我们的业务平台,以规避更大规模的风险。但在多云平台部署的架构下,多云资源的管理成为了一个耗时耗力,管理与运维成本颇高的难点。这导致了第一,云管人员需要精通掌握两家甚至多家云厂商的技术与服务产品,或者第二,多支独立团队分别运维与管理导致的高团队成本等诸多痛点。所以公有云资源纳管平台(以下简称云管平台)应运而生。</p>\n<p>云管平台简化了运管人员的操作流程,降低了公有云产品的技术门槛,但是在多云产品的集中式纳管上,却难度重重。其一,不同公有云厂商,使用独立的 infrastructure-as-code (以下简称 IaC )体系或者服务,譬如亚马逊云科技的 Cloudformation 服务;其二,不论云厂商还是开源的 IaC 产品,均使用标记语言或者类标记语言编写代码,鲜有使用 Java, Python 或者 Golang 等开发语言的运行时,这对于精通于开发语言的,云管平台的开发人员导致了额外学习成本,需要从0开始学习标记语言,往往会导致开发团队的抵触甚至拒绝;其三,标记语言运行过程中,更倾向于将整体堆栈运行完毕之后,输出对应的 outputs,但在运行过程中,存在难以直接循环调用 outputs,无法写入数据库等诸多难点,这增大了编写难度以及代码编写工作量。有没有一款产品,能够适配主流公有云 IaC,又可以使用高级编程语言编写代码呢?</p>\n<h3><a id=\\"_Pulumi_5\\"></a><strong>什么是 Pulumi?</strong></h3>\\n<p>Pulumi 是非常流行的,现代化 IaC<br />\\n平台。Pulumi 引入了主流编程语言,譬如 JavaScript,Python,Java,Golang,.NET,以及标记语言 YAML,可以使用上述语言,通过 Pulumi SDK 管理不同云厂商的资源。Pulumi 目前已经支持了主流公有云厂商譬如亚马逊云科技,微软 Azure,谷歌云与阿里云,及其生态譬如 Fastly,Akamai,Cloudflare,Kubernetes,Kong,Apache Kafka 等。</p>\n<p>Pulumi 的组成如下图所示:</p>\n<p>每一个 Pulumi 项目包含至少一个程序组,程序组由编程语言书写,描述不同资源的运作</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/d07d3d9bc98f4f779bd827dfcd1947b0_image.png\\" alt=\\"image.png\\" /></p>\n<p>以及彼此之间的关系。</p>\n<p>以下以 Python 代码为例,描述我们在 Pulumi 中创建了 web-sg 名称安全组,并附加该安全组,以 ’ami-6869aa05’为镜像,创建了实例规格为 t2.micro 的 EC2 虚拟机。</p>\n<pre><code class=\\"lang-\\">import pulumi\\nimport pulumi_aws as aws\\n\\ngroup = aws.ec2.SecurityGroup('web-sg',\\n description='Enable HTTP access',\\n ingress=[\\n { 'protocol': 'tcp', 'from_port': 80, 'to_port': 80, 'cidr_blocks': ['0.0.0.0/0'] }\\n ])\\n\\nserver = aws.ec2.Instance('web-server',\\n ami='ami-6869aa05',\\n instance_type='t2.micro',\\n vpc_security_group_ids=[group.name] \\n)\\n\\npulumi.export('public_ip', server.public_ip)\\npulumi.export('public_dns', server.public_dns)\\n</code></pre>\\n<p>Pulumi 如何工作<br />\\nPulumi 的运作由几个部分组成:</p>\n<p>第一,语言处理中枢。Language Host 负责运行 Pulumi 的程序,并为您的开发语言准备好与之对应的环境,譬如 Python3.7。语言中枢由两部分组成:</p>\n<p>1.执行器。它会协助 Pulumi 准备并设置好相应的 Runtime(运行时);</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/6a17e88aa72a43afa72d1fd2c3be5bbe_image.png\\" alt=\\"image.png\\" /></p>\n<p>2.运行时。它会负责为您编写的程序做好运行准备,并在过程中监控程序的运行。</p>\n<p>第二,资源提供方 Provider。</p>\n<p>资源提供方通过资源插件(Resource Plugin,用来管理资源)与原生 SDK 协作,来管理云端资源。</p>\n<p>有了上述两部分组成,Engine 引擎就可以实现云端资源的管理。引擎已经被封装进 pulumi cli,无需额外安装与部署。</p>\n<h4><a id=\\"_Pulumi__56\\"></a><strong>如何创建一个 Pulumi 项目</strong></h4>\\n<p>1.安装 Pulumi(以 Linux 为例)</p>\n<pre><code class=\\"lang-\\">curl -fsSL https://get.pulumi.com | sh\\n</code></pre>\\n<p>2.安装运行时(以 Python 为例)</p>\n<p>请阅读 <a href=\\"https://docs.aws.amazon.com/zh_cn/parallelcluster/latest/ug/install-linux-python.html\\" target=\\"_blank\\">如何在 Linux 上安装 Python3</a> 本文不再复述</p>\\n<p>3.配置权限</p>\n<p>请阅读 <a href=\\"https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/getting-started-install.html\\" target=\\"_blank\\">安装或更新最新版本的 Amazon CLI</a> ,完成 Amazon CLI 的安装,本文不再复述</p>\\n<p>请阅读 <a href=\\"https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-chap-configure.html\\" target=\\"_blank\\">配置 Amazon CLI</a> 完成完成权限配置,本文不再复述</p>\\n<p>4.创建新项目</p>\n<pre><code class=\\"lang-\\">\$mkdir newproject &amp;&amp; cd newproject\\n\$pulumi new aws-python\\n</code></pre>\\n<p>Pulumi new 的命令行会通过交互式的方式,为您创建新的项目与新的堆栈(stack),并安装好所有需要的组件(Module)。</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/3779311d91cd4f3da8f88cbaeadf8e2f_image.png\\" alt=\\"image.png\\" /></p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/ee87c7c8ed8945028bed9d9d77a6899e_image.png\\" alt=\\"image.png\\" /></p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/d4c666c6561d4c13910844e0b83b5d37_image.png\\" alt=\\"image.png\\" /></p>\n<p>5.部署这个项目</p>\n<p>执行 pulumi up 进行项目部署</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/b1ee00bb315e4916b96aac20d4a5d626_image.png\\" alt=\\"image.png\\" /></p>\n<p>执行成功后,我们可以在 S3 中看到有 pulumi 创建出来的 S3 桶</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/88a7c2f4056b4599afaea4933e28f292_image.png\\" alt=\\"image.png\\" /></p>\n<p>6.调整项目部署</p>\n<p>我们要在已经部署的项目中,做出一些调整。之前的部署结束后,我们创建了一个 S3 桶,这次我们需要为其添加一个 index.html 并将其托管为静态站点</p>\n<p>6.1创建站点首页</p>\n<pre><code class=\\"lang-\\">#touch index.html\\n</code></pre>\\n<p>在其中添加文本:</p>\n<pre><code class=\\"lang-\\">&lt;html&gt;\\n &lt;body&gt;\\n &lt;h1&gt;Hello, Amazon!&lt;/h1&gt;\\n &lt;/body&gt;\\n&lt;/html&gt;\\n</code></pre>\\n<p>保存后,编辑__main__.py</p>\n<p>在结尾处添加:</p>\n<p>bucketObject = s3.BucketObject( ‘index.html’, bucket=bucket.id, source=pulumi.FileAsset(‘index.html’))</p>\n<p>再次执行 pulumi up 变更部署</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/882c66868096444cb44c8de629974f1e_image.png\\" alt=\\"image.png\\" /></p>\n<p>6.2 调整部署</p>\n<p>这次我们需要编辑 S3 bucket 的属性,使其托管静态站点,并调整 Bucket ACL,使其可以被匿名访问。</p>\n<p>编辑 <strong>main</strong>.py</p>\\n<p>替换 bucket segment,使其成为:</p>\n<pre><code class=\\"lang-\\">bucket = s3.Bucket('my-bucket',\\n website=s3.BucketWebsiteArgs(\\n index_document=&quot;index.html&quot;,\\n))\\n</code></pre>\\n<p>在结尾处,增加输出:</p>\n<pre><code class=\\"lang-\\">pulumi.export('bucket_endpoint', pulumi.Output.concat('http://', bucket.website_endpoint))\\n</code></pre>\\n<p>执行 Pulumi up,发布项目变更后,得到输出结果:</p>\n<pre><code class=\\"lang-\\">Outputs:\\n + bucketEndpoint: &quot;http://my-bucket-e7bfd5a.s3-website-us-west-2.amazonaws.com&quot;\\n bucketName : &quot;my-bucket-e7bfd5a&quot;\\n</code></pre>\\n<p>访问 bucketEndpoint,我们可以看到</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/dc84e75378c843ac86b0aa1de46125a0_image.png\\" alt=\\"image.png\\" /></p>\n<p>7.销毁项目</p>\n<p>我们可以执行 pulumi destroy 销毁项目。</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/360f5373dd2c47e8bbfbaaefe96c2991_image.png\\" alt=\\"image.png\\" /></p>\n<h3><a id=\\"_168\\"></a><strong>结论</strong></h3>\\n<p>通过这个简单的案例,我们展示了通过 pulumi 可以轻松的创建,管理与删除一个项目,在项目中,我们可以创建,调整,管理,删除与项目相关的 Resource,将 pulumi 与编程语言相结合,可以实现云管平台的个性化需求,并通过云管平台的几次点击,实现复杂逻辑下,不同云服务的组合,满足业务场景的需求。</p>\n<h4><a id=\\"_171\\"></a><strong>额外案例</strong></h4>\\n<p>我们会额外提供几个 pulumi program,方便大家直观的了解到 pulumi 的编码方式。</p>\n<ol>\\n<li>创建一个名称为 “DocumentDBCluster”Amazon DocumentDB 的 Cluster,自动备份保存15天,必须开启删除保护。然后将 DocumentDB Cluster Endpoint 输出。</li>\n</ol>\\n<pre><code class=\\"lang-\\">import pulumi\\nimport pulumi_aws as aws\\n\\ndocdb = aws.docdb.Cluster(&quot;docdb&quot;,\\n backup_retention_period=5,\\n cluster_identifier=&quot;DocumntDBCluster&quot;,\\n engine=&quot;docdb&quot;,\\n master_password=&quot;mustbeeightchars&quot;,\\n master_username=&quot;foo&quot;,\\n deletion_protection=True,\\n skip_final_snapshot=True)\\npulumi.export('DocumentCluster_endpoint', docdb.endpoint)\\n</code></pre>\\n<p>下面是一个稍微复杂一些的场景:</p>\n<ol start=\\"2\\">\\n<li>场景共由五个部分组成,第一部分,环境定义;第二部分,创建 SSH&amp;HTTP 的安全组,第三部分,创建 EC2 并附加 EIP,第四部分,创建 Aurora ServerlessV2,第五部分,输出。大家能够通过下列 python 代码与场景逐一对应。</li>\n</ol>\\n<pre><code class=\\"lang-\\">import pulumi\\nimport pulumi_aws as aws\\n\\nconfig = pulumi.Config()\\navailability_zone = config.require(&quot;availabilityZone&quot;)\\nenvironment_type = config.get(&quot;environmentType&quot;)\\nif environment_type is None:\\n environment_type = &quot;dev&quot;\\nami_id = config.get(&quot;amiID&quot;)\\nif ami_id is None:\\n ami_id = &quot;&quot;\\nami_id_value = &quot;/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2&quot; if ami_id == &quot;&quot; else aws.get_ssm_parameter_string().value\\nkey_pair_name = config.require(&quot;keyPairName&quot;)\\ndb_instance_identifier = config.get(&quot;dbInstanceIdentifier&quot;)\\nif db_instance_identifier is None:\\n db_instance_identifier = &quot;mydatabase&quot;\\ndb_username = config.get(&quot;dbUsername&quot;)\\nif db_username is None:\\n db_username = &quot;postgres&quot;\\ndb_password = config.require(&quot;dbPassword&quot;)\\n\\nweb_app_security_group = aws.ec2.SecurityGroup(&quot;webAppSecurityGroup&quot;,\\n name=&quot;webAppSG&quot;,\\n description=&quot;Allow HTTP/HTTPS and SSH inbound and outbound traffic&quot;,\\n ingress=[\\n aws.ec2.SecurityGroupIngressArgs(\\n ip_protocol=&quot;tcp&quot;,\\n from_port=80,\\n to_port=80,\\n cidr_ip=&quot;0.0.0.0/0&quot;,\\n ),\\n aws.ec2.SecurityGroupIngressArgs(\\n ip_protocol=&quot;tcp&quot;,\\n from_port=443,\\n to_port=443,\\n cidr_ip=&quot;0.0.0.0/0&quot;,\\n ),\\n aws.ec2.SecurityGroupIngressArgs(\\n ip_protocol=&quot;tcp&quot;,\\n from_port=22,\\n to_port=22,\\n cidr_ip=&quot;0.0.0.0/0&quot;,\\n ),\\n])\\n\\nweb_app_instance = aws.ec2.Instance(&quot;webAppInstance&quot;,\\n availability_zone=availability_zone,\\n image_id=ami_id_value,\\n instance_type=&quot;t2.small&quot;,\\n key_name=key_pair_name,\\n security_groups=[web_app_security_group.id,default,])\\nweb_app_eip = aws.ec2.EIP(&quot;webAppEIP&quot;,\\n vpc=True,\\ninstance=web_app_instance.id)\\n\\nweb_app_database = aws.rds.Cluster(&quot;webAppDatabase&quot;,\\n cluster_identifier=db_instance_identifier,\\n engine=&quot;aurora-postgresql&quot;,\\n engine_mode=&quot;provisioned&quot;,\\n engine_version=&quot;13.6&quot;,\\n database_name=db_username,\\n master_username=db_username,\\n master_password=db_password,\\n serverlessv2_scaling_configuration=aws.rds.ClusterServerlessv2ScalingConfigurationArgs(\\n max_capacity=1,\\n min_capacity=0.5,\\n ))\\nweb_app_database_instance = aws.rds.ClusterInstance(&quot;webAppDatabaseInstance&quot;,\\n cluster_identifier=web_app_database.id,\\n instance_class=&quot;db.serverless&quot;,\\n engine=web_app_database.engine,\\n engine_version=web_app_database.engine_version)\\n\\npulumi.export(&quot;websiteURL&quot;, web_app_eip.id.apply(lambda id: f&quot;http://{id}&quot;))\\npulumi.export(&quot;webServerPublicDNS&quot;, web_app_instance.public_dns_name)\\npulumi.export(&quot;webAppDatabaseEndpoint&quot;, web_app_database.endpoint)\\n</code></pre>\\n<h3><a id=\\"_275\\"></a><strong>参考资源:</strong></h3>\\n<p>了解 Pulumi 的 Registry</p>\n<p><a href=\\"https://www.pulumi.com/registry/\\" target=\\"_blank\\">https://www.pulumi.com/registry/</a></p>\\n<p>安装 Python3</p>\n<p><a href=\\"https://docs.aws.amazon.com/zh_cn/parallelcluster/latest/ug/install-linux-python.html\\" target=\\"_blank\\">https://docs.aws.amazon.com/zh_cn/parallelcluster/latest/ug/install-linux-python.html</a></p>\\n<p>安装或更新最新版本的 Amazon CLI</p>\n<p><a href=\\"https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/getting-started-install.html\\" target=\\"_blank\\">https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/getting-started-install.html</a></p>\\n<p>配置 Amazon CLI</p>\n<p><a href=\\"https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-chap-configure.html\\" target=\\"_blank\\">https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-chap-configure.html</a></p>\\n<h3><a id=\\"_292\\"></a><strong>本篇作者</strong></h3>\\n<p><img src=\\"https://dev-media.amazoncloud.cn/a2a299df4ba649c787929b32fc12d17e_image.png\\" alt=\\"image.png\\" /></p>\n<h4><a id=\\"_296\\"></a><strong>付晓明</strong></h4>\\n<p>亚马逊云解决方案架构师,负责云计算解决方案的咨询与架构设计,同时致力于数据库,边缘计算方面的研究和推广。在加入亚马逊云科技之前曾在金融行业 IT 部门负责互联网券商架构的设计,对分布式,高并发,中间件等具有丰富经验。</p>\n"}
目录
亚马逊云科技解决方案 基于行业客户应用场景及技术领域的解决方案
联系亚马逊云科技专家
亚马逊云科技解决方案
基于行业客户应用场景及技术领域的解决方案
联系专家
0
目录
关闭