Amazon Web Services ブログ

AWS とサードパーティーのサービスにアクセスするための統一された API である AWS クラウドコントロール API

2021 年 9 月 30 日、AWS クラウドコントロール API のリリースをお知らせします。AWS クラウドコントロール API は、デベロッパーが AWS およびサードパーティーのサービスを簡単に管理できるようにするために設計された、一般的なアプリケーションプログラムインターフェイス (API) のセットです。

AWS は、最も広範かつ深いクラウドサービスのポートフォリオを提供しています。ビルダーはこれらを活用して、あらゆる種類のクラウドインフラストラクチャを構築します。15 年前Amazon Simple Storage Service (Amazon S3) を皮切りにサービスの提供が開始され、200 を超えるサービスを提供するまでに成長しました。各 AWS のサービスには、独自の語彙、入力パラメータ、およびエラーレポートを備えた特定の API があります。例えば、S3 CreateBucket API を使用して、Amazon Simple Storage Service (Amazon S3) バケットを作成したり、Amazon Elastic Compute Cloud (Amazon EC2) RunInstances API を使用して EC2 インスタンスを作成したりできます。

AWS API を使用して、Infrastructure as Code を構築したり、セキュリティ体制を検査して自動的に改善したり、設定管理のために使用したり、高性能コンピューティングクラスターをプロビジョンして設定したりするお客様もいらっしゃいます。ユースケースは数え切れないほどあります。

アプリケーションとインフラストラクチャがますます高度化し、AWS のサービスでの作業がより多くなるにつれて、個別の API の学習と管理はますます困難になっています。インフラストラクチャでサードパーティーのサービスも利用する場合には、AWS とサードパーティーのサービスの両方を一緒に管理するカスタムコードを構築して維持する必要があるため、この課題はさらに深刻なものとなります。

クラウドコントロール API は、数百の AWS のサービス (さらに追加予定) と数十のサードパーティーのサービス (拡大中) 全体で、リソースの作成、読み取り、更新、削除、および一覧表示 (CRUDL) を実行するための標準的な API セットです。

サービスのライフサイクルを管理するための 5 つの一般的な動詞 (CreateResourceGetResourceUpdateResourceDeleteResourceListResource) を公開しています。例えば、Amazon Elastic Container Service (Amazon ECS) クラスターまたは AWS Lambda 関数を作成するには、同じ CreateResource API を呼び出し、作成するリソース (Amazon ECS クラスターまたは Lambda 関数) のタイプと属性をパラメータとして渡します。入力パラメータは、JSON を使用した統合リソースモデルによって定義されます。同様に、戻り値のタイプとエラーメッセージは、すべての動詞とすべてのリソースで統一されています。

クラウドコントロール API は、今日数百の AWS リソースのサポートを提供しており、引き続き、Amazon Elastic Compute Cloud (Amazon EC2)Amazon Simple Storage Service (Amazon S3) などサービス全体で既存の AWS リソースのサポートを今後数か月間のうちに追加する予定です。通常、リリース当日に新しい AWS リソースをサポートします。

今日まで、Lambda 関数または Amazon Kinesis ストリームの詳細を取得したい場合には、get-function API を使用して Lambda を呼び出し、describe-stream API を使用して Kinesis を呼び出していました。以下の例では、これらの 2 つの 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"
    }
}	

対照的に、クラウドコントロール API を使用する場合、get-resource という単一の API 名を使用し、一貫した出力を受け取ります。

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}"

私は、3 種類のビルダーがクラウドコントロール API を採用するのではないかと考えています。

ビルダー
最初のコミュニティは、AWS のサービス API を使用してインフラストラクチャまたは顧客のインフラストラクチャを管理するビルダーです。より高いレベルのツールではなく、低いレベルの AWS のサービス API の利用を必要とするユーザーです。例えば、私はクライアントに代わって AWS インフラストラクチャを管理している企業を知っています。多くの企業が、管理および請求の目的で、クライアントの AWS アカウントにデプロイされたすべてのリソースを一覧表示および説明するソリューションを開発しました。多くの場合、これらの企業は要件を満たすために特定のツールを構築しましたが、新しい AWS のサービスや機能に対応していくのは困難であると感じています。クラウドコントロール API は、一貫性のあるリソース中心のアプローチにより、この種のツールを簡素化します。これにより、新しい AWS のサービスや機能に対応していくのがより容易になります。

別の例: Stedi は、あらゆるビジネスシステムと統合する自動化された Electronic Data Interchange (EDI) ソリューションを構築するための、デベロッパー中心のプラットフォームです。「当社は Stedi 内の Infrastructure as Code (IaC) に重点を置き、複雑さを軽減し、コスト管理を容易にするため、CloudFormation を通じて管理されなくなったレガシークラウドリソースを検出して削除するためのプログラムを使用した方法を模索してきました」と Stedi, Inc. のサーバーレスエンジニアである Olaf Conjin 氏は述べています。「AWS クラウドコントロール API を使用することで、当社のチームは簡単にこれらのレガシーリソースをそれぞれ一覧表示し、CloudFormation が管理するリソースと相互参照して、追加のロジックを適用し、レガシーリソースを削除できます。クラウドコントロール API を使用してこれらの未使用のレガシーリソースを削除することで、当社ではクラウドの支出をより簡単かつ迅速に管理できるようになりました。クラウドコントロール API により、各タイプのリソースを検出および削除するためのカスタムコードを作成および維持する必要がなくなります。これにより、デベロッパーの作業速度を向上させることができます」

AWS パートナー
クラウドコントロール API の恩恵を受ける第 2 のコミュニティは、HashiCorp (Terraform のメーカー) や Pulumi などの AWS パートナー、および AWS のサービス API を利用するソリューションを提供する他の APN パートナーです。AWS が新しいサービスまたは機能をリリースする場合、パートナーのエンジニアリングチームは、新しい一連の AWS のサービス API を学習、統合、およびテストして、そのサービスで公開する必要があります。これは時間のかかるプロセスであり、多くの場合、AWS のリリースと、ソリューションでサービスまたは機能が利用可能になるタイミングの間にラグが生じます。新しいクラウドコントロール API により、パートナーは、統一された API 動詞、共通入力パラメータ、および一般的なエラータイプを使用して、独自の REST API コードベースを構築できるようになりました。標準化かつ事前定義された統一リソースモデルをマージして、REST リソースとして公開される新しい AWS のサービスとインタラクションするだけで済みます。

リリースパートナー
HashiCorp と Pulumi は当社のリリースパートナーであり、両社のソリューションは現在、クラウドコントロール API と統合されています。

HashiCorp は、組織があらゆるアプリケーションのためにあらゆるインフラストラクチャをプロビジョン、保護、接続、および実行できるようにするクラウドインフラストラクチャのオートメーションソフトウェアを提供します。「AWS クラウドコントロール API により、当社のチームは、新規および既存の AWS のサービスと統合するソリューションをより容易に構築することができます」と HashiCorp の製品担当 EVP である James Bayer 氏は述べています。「HashiCorp Terraform を AWS クラウドコントロール API と統合することで、デベロッパーは通常、リリース当日に新しくリリースされた AWS の機能とサービスを利用できます」

AWS クラウドコントロール API を使用する Pulumi の新しい AWS Native Provider は、「当社が手動でサポートを実装することを必要とすることなく、Pulumi のユーザーがに迅速に (通常はリリース日に) 最新の AWS のイノベーションにアクセスすることを可能にします」と、Pulumi の CEO である Joe Duffy 氏は述べています。「AWS クラウドコントロール API によって提供される AWS リソースの全領域は、Python、TypeScript、.NET、Go などの使い慣れた言語を使用して、標準の IDE、パッケージマネージャー、およびテストフレームワークと合わせて、忠実度と優れた質を備えた状態で自動化できるようになりました。この新しいプロバイダーを使用することで、デベロッパーやインフラストラクチャチームは、最新の AWS アプリケーションとインフラストラクチャを、かつてないほど迅速かつ自信を持って開発し、ユーザーに届けることができます」

HashiCorp と Pulumi のクラウドコントロール API との統合の詳細については、各社のブログ投稿とお知らせをご覧ください。利用可能になり次第、ここにリンクを追加します。

AWS のお客様
クラウドコントロール API の恩恵を享受する第 3 のタイプのビルダーは、Terraform や Pulumi などのソリューションを利用している AWS のお客様です。これらのお客様は、クラウドコントロール API の恩恵も受けることができます。例えば、新しい Terraform AWS Cloud Control のプロバイダーまたは Pulumi の AWS Native Provider を利用する場合、通常はリリース当日に、新しい AWS のサービスや機能を利用できます。

メリットがわかったので、クラウドコントロール API がどのように機能するかを見てみましょう。

仕組み
クラウドコントロール API の使用を開始するには、最新の AWS Command Line Interface (CLI) バージョンを使用していることを最初に確認します。CLI のインストール方法に応じて、CLI を更新する方法が異なりますクラウドコントロール API は、AWS SDK からも利用できます。

AWS Lambda 関数を作成するには、まず index.py ハンドラーを作成し、zip して、その zip ファイルを自分のプライベートバケットの 1 つにアップロードします。S3 バケットは、Lambda 関数を作成するのと同じ AWS リージョンにあることに注意します。

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 AWS::Lambda::Function に関するドキュメントに従って、CodeRoleRuntime、および 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 です (より説明的な名前を希望する場合は自分の名前を渡すことができます :-) )

その後、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!\""}

終了したら、クラウドコントロール API を使用して 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"
    }
}

べき等性
create-resource API コールに渡した client-token パラメータにお気付きかもしれません。CreateUpdate、および Delete のリクエストはすべて、リクエストのべき等性を保証するために使用される ClientToken を受け入れます。

  • 常にクライアントトークンを渡すことをお勧めします。これにより、再試行が必要な場合にリクエストが明確になります。渡さない場合、ConcurrentOperationExceptionAlreadyExists などの予期しないエラーが発生する可能性があります。
  • クライアントトークンは、UUID を渡すなど、リクエストごとに常に一意になるようにすることをお勧めします。

追加情報
AWS クラウドコントロール API のデータソースの中心には、CloudFormation Public Registry があります。これは私の同僚の Steve が今月初めにこのブログ記事で発表したものです。これにより、CloudFormationAWS CDK を通じて誰でも一連の AWS リソースを公開できます。これは、AWS のサービスチームがサービスと機能を CloudFormation および AWS CDK リソースとしてリリースするために現在使用しているメカニズムです。また、複数のサードパーティーベンダーが CloudFormation Public Registry にソリューションを公開しています。公開されるすべてのリソースは、リソース、プロパティ、および属性を統一的に定義する標準スキーマでモデル化されています。

AWS クラウドコントロール API は、CloudFormation Public Registry で公開されたリソースの上にある CRUDL API レイヤーです。レジストリで公開されるリソースは、その属性を標準の JSON スキーマで公開します。リソースは、追加の作業なしで、クラウドコントロール API を使用して作成、更新、削除、または一覧表示できます。

例えば、パブリックな CloudFormation スタックを公開して、AWS のお客様が EC2 インスタンスに基づいて VPN サーバーを作成できるようにするとします。VPNServer リソースタイプをモデル化し、CloudFormation Public Registry に公開します。私の側で追加の作業を行うことなく、私のカスタムリソース「VPNServer」は、クラウドコントロール API REST API を通じてすべての AWS のお客様にご利用いただける状態となりました。それにとどまらず、このリソースは、HashiCorp の Terraform や Pulumi などのソリューション、および将来クラウドコントロール API を採用する可能性のある他のソリューションを通じて自動的に利用可能となります。

なお、クラウドコントロール API は、従来の AWS のサービスレベル API を置き換えることを目的としていません。それらはまだ使用可能であり、これからも常に使用可能であり続ける予定ですが、当社では、クラウドコントロール API はより使いやすく、より一貫性があり、新しいアプリケーションに使用すべきであると考えています。

利用可能なリージョンと料金
クラウドコントロール API は、中国を除くすべての AWS リージョンでご利用いただけます。

CloudWatch ログや Lambda 関数の呼び出しなど、基盤となる AWS リソースの利用の料金のみをお支払いいただくか、サードパーティーのリソース (Datadog モニターや MongoDB Atlas クラスターなど) の使用に関連する、ハンドラーオペレーションの数とハンドラーオペレーションの期間にかかる料金のみをお支払いいただきます。最低料金はなく、前払いの義務もありません。

お客様がこの新しいクラウドコントロール API を使用して構築するものを目にするのが待ちきれません。構築しましょう!

— seb

原文はこちらです。