Amazon Cloud Control API,一个访问亚马逊云科技&第三方服务的统一API

ffb751a0abcf44d36ba43de77fb48a80.gif

前言

今布推出 Amazon Cloud Control API 是一组通用的应用程序编程接口(API),设计旨在让开发人员轻松管理其亚马逊云科技和第三方服务。

亚马逊云科技提供了最广泛、最深入的云服务组合。构建者利用这些服务来构建任何类型的云基础设施。它从15年前始于Amazon Simple Storage Service (Amazon S3)并发展了200多项服务。每项亚马逊云科技服务都有一个特定的 API,其中包含自己的词汇表、输入参数和错误报告。例如,您可以使用Amazon S3 CreateBucket API 创建 Amazon Simple Storage Service (Amazon S3) 存储桶,并使用Amazon Elastic Compute Cloud (Amazon EC2) RunInstances AP 创建Amazon EC2实例。

有些人使用Amazon API 构建基础设施即代码,有些人用它们检查并自动改善安全状况,另一些人则将它们用于配置管理或预置和配置高性能计算集群。使用案例数不胜数。

随着应用程序和基础设施变得越来越复杂,您可以跨越更多的亚马逊云科技服务工作,学习和管理不同的Amazon API就变得越来越困难。如果您还在基础设施中使用第三方服务,这一挑战就会加剧,因为您必须构建和维护自定义代码才能同时管理亚马逊云科技和第三方服务。

Amazon Cloud Control API是一组标准的API,可跨数百项亚马逊云科技服务(正在添加更多服务)和数十项第三方服务(在不断增长)创建、读取、更新、删除和列出 (CRUDL) 资源。

它公开了五个常用的动词(CreateResource、GetResource、UpdateResource、DeleteResource、ListResource)来管理服务的生命周期。例如,要创建Amazon Elastic Container Service (Amazon ECS)集群或Amazon Lambda函数,您可以调用同个 CreateResource API,将要创建的资源的类型和属性作为参数传递:Amazon ECS集群或Amazon Lambda 函数。输入参数由使用 JSON 的统一资源模型定义。同样,返回类型和错误消息在所有动词和所有资源中都是统一的。

Amazon Cloud Control API 现在为数百种亚马逊云科技资源提供支持,我们将在未来几个月里继续跨Amazon Elastic Compute Cloud (Amazon EC2)Amazon Simple Storage Service (Amazon S3)等服务增加对现有亚马逊云科技资源的支持。它通常会在发布当天支持新的亚马逊云科技资源。

直到今天,当我想获取有关Amazon Lambda函数或Amazon Kinesis流的详细信息时,我使用get-function API调用Amazon Lambda,并使用describe-stream API调用 Kinesis。请注意,在下面的示例中,这两个 API 调用的不同之处:它们具有不同的名称、不同的命名约定、不同的 JSON 输出等。

aws lambda get-function --function-name TictactoeDatabaseCdkStack
{
    "Configuration": {
        "FunctionName": "TictactoeDatabaseCdkStack",
        "FunctionArn": "arn:aws:lambda:us-west-2:0123456789:function:TictactoeDatabaseCdkStack",
        "Runtime": "nodejs14.x",
        "Role": "arn:aws:iam::0123456789:role/TictactoeDatabaseCdkStack",
        "Handler": "framework.onEvent",
        "CodeSize": 21539,
        "Timeout": 900,
        "MemorySize": 128,
        "LastModified": "2021-06-07T11:26:39.767+0000",

...

aws kinesis describe-stream --stream-name AWSNewsBlog
{
    "StreamDescription": {
        "Shards": [
            {
                "ShardId": "shardId-000000000000",
                "HashKeyRange": {
                    "StartingHashKey": "0",
                    "EndingHashKey": "340282366920938463463374607431768211455"
                },
                "SequenceNumberRange": {
                    "StartingSequenceNumber": "49622132796672989268327879810972713309953024040638611458"
                }
            }
        ],
        "StreamARN": "arn:aws:kinesis:us-west-2:012345678901:stream/AWSNewsBlog",
        "StreamName": "AWSNewsBlog",
        "StreamStatus": "ACTIVE",
        "RetentionPeriodHours": 24,
        "EncryptionType": "NONE",
        "KeyId": null,
        "StreamCreationTimestamp": "2021-09-17T14:58:20+02:00"
    }
}

*左滑查看更多

相比之下, 当使用 Amazon Cloud Control API 时,我使用单个API名称get-resource并收到一致的输出。

aws cloudcontrol get-resource        \
    --type-name AWS::Kinesis::Stream \
    --identifier NewsBlogDemo
{
   "TypeName": "AWS::Kinesis::Stream",
   "ResourceDescription": {
      "Identifier": "NewsBlogDemo",
      "Properties": "{\"Arn\":\"arn:aws:kinesis:us-west-2:486652066693:stream/NewsBlogDemo\",\"RetentionPeriodHours\":168,\"Name\":\"NewsBlogDemo\",\"ShardCount\":3}"
   }
}

*左滑查看更多

同样,为了创建上面的资源,我使用了create-resource API。

aws cloudcontrol create-resource    \
   --type-name AWS::Kinesis::Stream \
   --desired-state "{"Name": "NewsBlogDemo","RetentionPeriodHours":168, "ShardCount":3}"

*左滑查看更多

我认为,有三种类型的构建者将采用 Amazon Cloud Control API

1fd31f4b4afba3e93eb71fb7cf8b8f74.png

构建者

第一个社区是使用Amazon Cloud Control API管理其基础设施或其客户的基础设施的构建者。那些需要使用低级别Amazon Cloud Control API而不是更高级别工具的构建者。例如,我知道代表其客户管理亚马逊云科技基础设施的公司。许多开发的解决方案列出和描述在客户的亚马逊云科技账户中部署的所有资源,以便进行管理和计费。他们通常会构建特定的工具来满足自己的需求,但发现很难跟上新的亚马逊云科技服务和功能。Amazon Cloud Control API 通过提供一致的、以资源为中心的方法简化这种类型的工具。它可以更轻松地跟上新的亚马逊云科技服务和功能。

另一个例子:Stedi是一个以开发人员为中心的平台,用于构建与任何业务系统集成的自动化电子数据交换 (EDI) 解决方案。“我们非常关注Stedi的基础设施即代码 (IaC),并且一直在寻找一种程序化的方法来发现和删除不再通过CloudFormation管理的旧式云资源,从而帮助我们降低复杂性并管理成本”,Stedi, Inc.的无服务器工程师Olaf Conjin说。“借助 Amazon Cloud Control API ”,我们的团队可以轻松列出所有这些旧资源,将它们与CloudFormation 托管资源进行交叉引用,应用其他逻辑并删除旧资源。通过使用Amazon Cloud Control API 删除这些未使用的旧资源,我们可以更简单、更快捷地管理我们的云支出。借助 Amazon Cloud Control API ,我们无需编写和维护自定义代码即可发现和删除每种类型的资源,从而帮助我们提高开发人员的速度。”

6ef934a78abc12c5761fb58c7069affa.png

APN 合作伙伴

第二个受益于Amazon Cloud Control API的社区是APN 合作伙伴,例如HashiCorpTerraform的制造商)和Pulumi,以及提供依赖于Amazon Cloud Control API的其他APN合作伙伴。当 亚马逊云科技发布新服务或功能时,我们合作伙伴的工程团队需要学习、集成和测试一组新的Amazon Cloud Control API,以便在其产品中公开这些API。这是一个耗时的过程,通常会导致亚马逊云科技版本与其解决方案中的服务或功能可用性之间存在滞后。借助新的 Amazon Cloud Control API ,合作伙伴现在可以使用统一的API动词、通用输入参数和常见错误类型构建独特的REST API代码库。他们只需要合并标准化的预定义统一资源模型即可与作为REST资源公开的新亚马逊云科技服务进行交互。

f3d5edc6b44b7d64c5011b35d5525779.png

启动合作伙伴

HashiCorp和Pulumi是我们的启动合作伙伴,今天,这两个解决方案都与Amazon Cloud Control API进行了集成。

HashiCorp提供云基础设施自动化软件,使组织能够为任何应用程序预置、保护、连接和运行任何基础设施。“ Amazon Cloud Control API 使我们的团队能够更轻松地构建解决方案,以与新的和现有的亚马逊云科技服务集成”,HashiCorp产品执行副总裁James Bayer表示。“将HashiCorp Terraform与Amazon Cloud Control API集成意味着开发人员能够使用新发布的 亚马逊云科技功能和服务,通常在发布当天即可使用。”

Pulumi是新的亚马逊云科技原生提供商,由 Amazon Cloud Control API 提供支持,“让 Pulumi的用户能够更快地访问最新的亚马逊云科技创建,通常在其发布当天即可访问,无需我们手动实施支持”,Pulumi首席执行官Joe Duffy表示。“Amazon Cloud Control API 提供的亚马逊云科技资源的完整表面积现在可以通过Python、TypeScript、.NET和Go 等熟悉的语言、使用标准IDE、程序包管理器和测试框架高保真度、高质量地进行自动化。使用这个新的提供商,开发人员和基础设施团队可以比以往更快、更有信心地开发和交付现代 亚马逊云科技应用程序和基础设施。”

要了解有关HashiCorp 和 Pulumi与 Amazon Cloud Control API 集成的更多信息,请参阅他们的博客文章和公告。一旦链接可用,我会在此添加它们。

92a3fb09cd1383d5704753ac20031ca5.png

亚马逊云科技客户

将受益于 Amazon Cloud Control API 的第三种构建者是使用Terraform或Pulumi之类的解决方案的亚马逊云科技客户。您也可以从 Amazon Cloud Control  API 中受益。例如,使用新的Terraform亚马逊云科技控制提供商或Pulumi的亚马逊云科技原生提供商时,您通常可以在发布当天获得新的亚马逊云科技服务和功能。

现在您已经了解了这些益处,我们来看看 Amazon Cloud Control API 的实际应用。

a620548f3ff66f63b1561f640d4388d2.png

工作原理

要开始使用 Amazon Cloud Control API ,首先确保我使用的是最新的亚马逊云科技命令行界面 (CLI) 版本。根据CLI的安装方式,可以通过不同的方法来更新CLI。Amazon Cloud Control API 也可以通过我们的亚马逊云科技开发工具包提供。

为了创建Amazon Lambda函数,首先创建一个index.py处理程序、压缩该程序,然后将压缩文件上传到我的私有存储桶之一。我注意到Amazon S3存储桶位于我将在其中创建Amazon Lambda函数的同一亚马逊云科技区域中:

cat << EOF > index.py  
heredoc> import json 
def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
EOF

zip index.zip index.py
aws s3 cp index.zip s3://private-bucket-seb/index.zip

*左滑查看更多

然后,我调用create-resource API,传递相应CloudFormation资源所需的同一组参数。在此示例中,根据CloudFormation Amazon::Lambda::Function文档,Code, Role、Runtime 和 Handler参数是必需的。

aws cloudcontrol create-resource          \
       --type-name AWS::Lambda::Function   \
       --desired-state '{"Code":{"S3Bucket":"private-bucket-seb","S3Key":"index.zip"},"Role":"arn:aws:iam::0123456789:role/lambda_basic_execution","Runtime":"python3.9","Handler":"index.lambda_handler"}' \
       --client-token 123


{
    "ProgressEvent": {
        "TypeName": "AWS::Lambda::Function",
        "RequestToken": "56a0782b-2b26-491c-b082-18f63d571bbd",
        "Operation": "CREATE",
        "OperationStatus": "IN_PROGRESS",
        "EventTime": "2021-09-26T12:05:42.210000+02:00"
    }
}

*左滑查看更多

我可能会再次调用相同的命令来获取状态或了解最终的错误:

aws cloudcontrol create-resource          \
       --type-name AWS::Lambda::Function   \
       --desired-state '{"Code":{"S3Bucket":"private-bucket-seb","S3Key":"index.zip"},"Role":"arn:aws:iam::0123456789:role/lambda_basic_execution","Runtime":"python3.9","Handler":"index.lambda_handler"}' \
       --client-token 123

{
    "ProgressEvent": {
        "TypeName": "AWS::Lambda::Function",
        "Identifier": "ukjfq7sqG15LvfC30hwbRAMfR-96K3UNUCxNd9",
        "RequestToken": "f634b21d-22ed-41bb-9612-8740297d20a3",
        "Operation": "CREATE",
        "OperationStatus": "SUCCESS",
        "EventTime": "2021-09-26T19:46:46.643000+02:00"
    }
}

*左滑查看更多

在这里,OperationStatus是SUCCESS,函数名称为ukjfq7sqG15LvfC30hwbRAMfR-96K3UNUCxNd9(如果我想要某个内容更具有描述性,我可以传递自己的姓名 :-))

然后我调用Amazon Lambda函数来确保它按预期工作:

aws lambda invoke \
    --function-name ukjfq7sqG15LvfC30hwbRAMfR-96K3UNUCxNd9 \
    out.txt && cat out.txt && rm out.txt 

{
    "StatusCode": 200,
    "ExecutedVersion": "$LATEST"
}
{"statusCode": 200, "body": "\"Hello from Lambda!\""}

*左滑查看更多

完成后,我会使用 Amazon Cloud Control API 删除Amazon Lambda函数:

aws cloudcontrol delete-resource \
     --type-name AWS::Lambda::Function \
     --identifier ukjfq7sqG15LvfC30hwbRAMfR-96K3UNUCxNd9 
{
    "ProgressEvent": {
        "TypeName": "AWS::Lambda::Function",
        "Identifier": "ukjfq7sqG15LvfC30hwbRAMfR-96K3UNUCxNd9",
        "RequestToken": "8923991d-72b3-4981-8160-4d9a585965a3",
        "Operation": "DELETE",
        "OperationStatus": "IN_PROGRESS",
        "EventTime": "2021-09-26T20:06:22.013000+02:00"
    }
}

*左滑查看更多

5b474be38d925c4836f457da861507b2.png

幂等性

您可能已经注意到传递到create-resource API调用的client-token参数。Create、Update和Delete请求全部都接受ClientToken,该令牌被用于确保请求的幂等性

我们建议始终传递客户端令牌。如果需要重试,这将消除请求的歧义。否则,您可能会遇到意外的错误,例如ConcurrentOperationException或AlreadyExists。

我们建议客户端令牌对于每个请求始终是唯一的,例如通过传递UUID

36fcb057953f2c51d6a3f1a4125ac245.png

还有一件事

Amazon Cloud Control API 数据源的核心有一个CloudFormation公有注册表,它由我的同事Steve本月早些时候在本博客文章中发布。通过它,任何人都可以通过CloudFormation和Amazon CDK公开一组亚马逊云科技资源。这是亚马逊云科技服务团队现在用来将其服务和功能作为CloudFormation和Amazon CDK资源发布的机制。多家第三方供应商也在CloudFormation公有注册表中发布了其解决方案。所有已发布的资源都使用以统一的方式定义资源、其性能及其属性的标准架构进行建模

Amazon Cloud Control API 是在CloudFormation公有注册表中发布的资源之上的CRUDL API层。注册表中发布的任何资源都会使用标准JSON模式公开其属性。然后,可以使用 Amazon Cloud Control API 创建、更新、删除或列出资源,而无需进行额外工作。

例如,假设我决定公开一个公有CloudFormation堆栈来让 亚马逊云科技客户基于Amazon EC2实例创建VPN服务器。我为VPNServer资源类型建模并将其发布到 CloudFormation公有注册表中。由于我没有额外的工作,我的自定义资源“VPNServer”现在可以通过 Amazon Cloud Control API REST API向所有亚马逊云科技客户提供。不仅如此,它还可以通过Hashicorp的Terraform和Pulumi等解决方案,以及未来可能采用 Amazon Cloud Control API 的其他解决方案自动提供。

值得一提的是,Amazon Cloud Control API并非旨在取代传统的Amazon Cloud Control API。它们仍然存在并将永远存在,但是我们认为Amazon Cloud Control API使用起来更简单,更一致,您应该将其用于新应用程序。

3da8a8c387f5af209ef755dfacf44675.png

可用性和定价

Amazon Cloud Control API 已在中国之外的所有亚马逊云科技区域推出。

您只需为基础亚马逊云科技资源(例如CloudWatch日志或Amazon Lambda函数调用)的使用量付费,或者为与使用第三方资源(例如Datadog监视器或MongoDB Atlas集群)相关联的处理程序操作次数和处理程序操作持续时间付费。没有最低费用,也无需预先承诺。

我迫不及待地想知道您将在这个新的 Amazon Cloud Control API 的基础上构建什么。立即构建!

2b4963a0b9eeb2b4c3e7645fed6baa39.gif

33d0fdde0dc950871e28c671975348ae.gif

听说,点完下面4个按钮

就不会碰到bug了!

38927c64d72f0c21ed04253e015ea950.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值