Amazon Web Services 한국 블로그

AWS Cloud Control API 출시 – AWS 및 서드 파티 서비스에 대한 API 서비스

오늘 AWS Cloud Control API 기능을 신규 출시합니다. 이 서비스는 개발자가 AWS와 서드 파티 서비스를 쉽게 관리할 수 있도록 설계된 일반적인 애플리케이션 프로그램 인터페이스(API) 집합입니다.

AWS는 가장 광범위하고 심층적인 클라우드 서비스 포트폴리오를 제공합니다. 빌더는 이러한 기능을 활용하여 모든 유형의 클라우드 인프라를 구축합니다. 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를 사용할 수 있습니다. 사용 사례는 매우 많습니다.

애플리케이션과 인프라가 점점 더 정교해지고 더 많은 AWS 서비스에서 작업함에 따라 여러 API를 학습하고 관리하기 점점 더 어려워지고 있습니다. 인프라에서 서드 파티 서비스도 사용하는 경우 AWS와 서드 파티 서비스를 함께 관리하기 위해 사용자 지정 코드를 구축하고 유지 관리해야 하므로 이러한 문제는 더욱 가중됩니다.

Cloud Control API는 수백 개의 AWS 서비스(더 추가 예정) 및 수십 개의 서드 파티 서비스(계속 증가)에서 리소스의 생성, 읽기, 업데이트, 삭제 및 나열(CRUDL) 작업을 수행하는 표준 API 집합입니다.

서비스 수명 주기를 관리하기 위해 다섯 가지 공통 동사(CreateResource, GetResource, UpdateResource, DeleteResource, ListResource)를 제공합니다. 예를 들어, Amazon Elastic Container Service (Amazon ECS) 클러스터 또는 AWS Lambda 함수를 생성하려면 동일한 CreateResource API를 호출하여 생성하려는 리소스(Amazon ECS 클러스터 또는 Lambda 함수)의 유형 및 속성을 파라미터로 전달합니다. 입력 파라미터는 JSON을 사용하는 통합 리소스 모델로 정의됩니다. 마찬가지로, 반환 유형과 오류 메시지는 모든 동사와 모든 리소스에서 균일합니다.

Cloud Control 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를 호출했습니다. 아래 예제에서 이 두 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"
    }
}	

반면, 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}"

Cloud Control API를 채택하는 세 가지 유형의 빌더가 존재할 수 있습니다.

빌더
첫 번째 커뮤니티는 AWS 서비스 API를 사용하여 인프라 또는 고객의 인프라를 관리하는 빌더입니다. 상위 수준 도구 대신, 하위 수준 AWS 서비스 API를 사용해야 하는 경우가 이에 해당됩니다. 예를 들어, 고객을 대신하여 AWS 인프라를 관리하는 회사가 있습니다. 많은 회사가 관리 및 결제 목적으로 고객의 AWS 계정에 배포된 모든 리소스를 나열하고 설명하기 위해 솔루션을 개발합니다. 종종 요구 사항을 해결하기 위해 특정 도구를 구축하지만 새로운 AWS 서비스 및 기능을 따라잡기 힘듭니다. Cloud Control API는 리소스 중심의 일관된 접근 방식을 통해 이러한 유형의 도구를 단순화합니다. 그리고 새로운 AWS 서비스 및 기능을 보다 쉽게 따라갈 수 있습니다.

또 다른 사례: Stedi는 모든 비즈니스 시스템과 통합되는 자동화된 전자 데이터 교환(EDI) 솔루션을 구축하기 위한 개발자 중심 플랫폼입니다. “Stedi 내에서 코드형 인프라(IaC)에 대단히 집중하고 있으며, CloudFormation을 통해 더 이상 관리되지 않는 레거시 클라우드 리소스를 찾아 삭제하는 프로그래밍 방식을 모색하고 있습니다. 이를 통해 복잡성을 줄이고 비용을 효율적으로 관리하는 데 도움이 될 것입니다”라고 Stedi, Inc의 서버리스 엔지니어인 Olaf Conjin 씨는 말합니다. “AWS Cloud Control API를 통해 저희 팀은 이러한 각 레거시 리소스를 쉽게 표시하고 CloudFormation 관리형 리소스와 교차 참조하며 추가적인 논리를 적용하고 레거시 리소스를 삭제할 수 있습니다. Cloud Control API를 통해 이러한 사용되지 않는 레거시 리소스를 삭제하면 더 간단하고 빠른 방식으로 클라우드 비용을 관리할 수 있습니다. Cloud Control API를 사용하면 각 유형의 리소스를 찾아서 삭제하기 위해 사용자 지정 코드를 작성하고 유지 관리하지 않아도 되므로 개발자의 속도를 개선할 수 있습니다”.

AWS 파트너
Cloud Control API의 이점을 활용할 수 있는 두 번째 커뮤니티는 AWS 파트너(예: Terraform 제작사인 HashiCorpPulumi) 및 AWS 서비스 API에 의존하는 솔루션을 제공하는 기타 AWS 파트너입니다. AWS가 새로운 서비스 또는 기능을 출시할 때 파트너의 엔지니어링 팀은 새로운 AWS 서비스 API 집합을 학습, 통합 및 테스트하여 해당 서비스를 파트너 오퍼링에 공개해야 합니다. 그러려면 시간이 많이 걸리고 AWS 출시와 솔루션의 서비스 또는 기능의 가용성 사이에 지연이 발생할 수 있습니다. 이제 새로운 Cloud Control API를 사용하면 파트너는 통합된 API 동사, 공통 입력 파라미터 및 공통 오류 유형을 사용하여 고유한 REST API 코드 기반을 구축할 수 있습니다. REST 리소스로 공개되는 새로운 AWS 서비스와 상호 작용하기 위해 표준화 및 사전 정의된 균일한 리소스 모델을 병합하기만 하면 됩니다.

출시 파트너
HashiCorp 및 Pulumi는 출시 파트너이며, 두 솔루션 모두 현재 Cloud Control API에 통합되어 있습니다.

HashiCorp는 조직이 어떤 애플리케이션에 대해서든 모든 유형의 인프라를 프로비저닝, 보안, 연결 및 실행할 수 있도록 지원하는 클라우드 인프라 자동화 소프트웨어를 제공합니다. “AWS Cloud Control API를 통해 자사 팀은 신규 및 기존 AWS 서비스와 통합하는 솔루션을 보다 쉽게 구축할 수 있습니다”라고 HashiCorp의 EVP 제품 소속 James Bayer 씨는 말합니다. “HashiCorp Terraform을 AWS Cloud Control API에 통합하면 개발자는 보통 출시 당일에 새로 출시된 AWS 기능 및 서비스를 사용할 수 있습니다.”

AWS Cloud Control API로 구동되는 Pulumi의 새로운 AWS Native Provider는 “수동으로 지원을 구현하지 않고도 Pulumi의 사용자에게 보통 출시 당일 최신 AWS의 혁신적인 기능에 보다 빨리 액세스할 수 있게 해줍니다”라고 Pulumi의 CEO인 Joe Duffy 씨는 말합니다. “이제 AWS Cloud Control API에서 제공하는 AWS 리소스의 모든 공개된 영역을 표준 IDE, 패키지 관리자 및 테스트 프레임워크와 함께 Python, TypeScript, .NET, Go와 같은 친숙한 언어를 사용하여 높은 충실도와 뛰어난 품질로 자동화할 수 있습니다. 이 새로운 제공자를 통해 개발자와 인프라 팀은 그 어느 때보다 빠르고 자신 있게 최신 AWS 애플리케이션과 인프라를 개발하고 출시할 수 있습니다.”

Cloud Control API와 HashiCorp 및 Pulumi의 통합에 대한 자세한 내용은 해당 파트너의 블로그 게시물 및 발표문을 참조하세요. 자료가 제공되면 바로 여기에 링크를 추가하겠습니다.

AWS 고객
Cloud Control API의 이점을 활용할 수 있는 세 번째 유형의 빌더는 Terraform 또는 Pulumi와 같은 솔루션을 사용하는 AWS 고객입니다. 여러분도 Cloud Control API의 이점을 활용할 수 있습니다. 예를 들어, 새로운 Terraform AWS Cloud Control 제공자 또는 Pulumi의 AWS Native Provider를 사용하면 보통 출시 당일 새로운 AWS 서비스 및 기능의 가용성을 활용할 수 있습니다.

이점을 이해했으므로, Cloud Control API의 작동 방식에 대해 살펴보겠습니다.

작동 방식
Cloud Control API 사용을 시작하기 위해 먼저 최신 AWS Command Line Interface(CLI) 버전을 사용해야 합니다. CLI 설치 방법에 따라 CLI를 업데이트하는 다양한 방법이 있습니다. Cloud Control APIAWS SDK에서도 사용할 수 있습니다.

AWS Lambda를 생성하기 위해 먼저 index.py 핸들러를 생성하고 압축한 후 프라이빗 버킷 중 하나에 zip 파일을 업로드합니다. 이때 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 리소스에 필요한 것과 동일한 인수 집합을 전달합니다. 이 예제에서 Code, Role, RuntimeHandler 인수는 CloudFormation AWS::Lambda::Function 설명서에 따라 필수 인수입니다.

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

완료되면 Cloud Control 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 파라미터가 있습니다. 생성, 업데이트삭제 요청은 모두 요청의 멱등성을 보장하는 데 사용되는 ClientToken을 수락합니다.

  • 항상 클라이언트 토큰을 전달하는 것이 좋습니다. 그러면 재시도가 필요한 경우 요청을 명확히 할 수 있습니다. 그렇지 않으면 ConcurrentOperationException 또는 AlreadyExists와 같은 예상치 못한 오류가 발생할 수 있습니다.
  • 클라이언트 토큰은 UUID를 전달하는 등의 방식으로 모든 단일 요청에서 항상 고유한 편이 좋습니다.

한 가지 더
데이터에서 AWS Cloud Control API 소스의 핵심에는 CloudFormation 퍼블릭 레지스트리가 있습니다. 제 동료인 Steve는 이달 초 이 블로그 게시물에서 이 기능을 소개한 바 있습니다. 이 기능을 사용하면 누구라도 CloudFormationAWS CDK를 통해 AWS 리소스 세트를 공개할 수 있습니다. 이는 CloudFormationAWS CDK 리소스와 같은 서비스와 기능을 출시하기 위해 현재 AWS 서비스 팀이 사용하는 메커니즘입니다. 여러 서드 파티 공급 업체도 CloudFormation 퍼블릭 레지스트리에 솔루션을 게시하고 있습니다. 게시된 모든 리소스는 리소스, 속성 및 특성을 균일한 방식으로 정의하는 표준 스키마를 사용하여 모델링됩니다.

AWS Cloud Control API는 CloudFormation 퍼블릭 레지스트리에 게시된 리소스에 기반한 CRUDL API 계층입니다. 레지스트리에 게시된 리소스는 표준 JSON 스키마와 함께 해당 속성을 공개합니다. 그런 다음, 추가 작업 없이 Cloud Control API를 사용하여 리소스를 생성, 업데이트 삭제 또는 나열할 수 있습니다.

예를 들어, AWS 고객이 EC2 인스턴스에 기반하여 VPN 서버를 생성할 수 있도록 퍼블릭 CloudFormation 스택을 공개한다고 가정합니다. VPNServer 리소스 유형을 모델링하고 CloudFormation 퍼블릭 레지스트리에 게시합니다. 제 쪽에서 추가 작업 없이, 이제 사용자 지정 리소스 ‘VPNServer’는 Cloud Control API REST API를 통해 모든 AWS 고객이 사용할 수 있습니다. 또한, Hashicorp의 Terraform 및 Pulumi, 그리고 나중에 Cloud Control API를 채택할 기타 제품과 같은 솔루션을 통해 자동으로 사용할 수 있습니다.

Cloud Control API는 기존의 AWS 서비스 수준 API를 대체하는 것만이 목표가 아닙니다. 이러한 API는 여전히 존재하며 계속 제공될 것입니다. 하지만 Cloud Control API가 보다 사용하기 쉽고 일관되며, 새 앱에서는 이를 사용해야 합니다.

가용성 및 요금
Cloud Control API는 중국을 제외한 모든 AWS 리전에서 사용할 수 있습니다.

CloudWatch 로그 또는 Lambda 함수 호출과 같은 기본 AWS 리소스의 사용에 대한 요금만 지불하거나 서드 파티 리소스(예: Datadog 모니터 또는 MongoDB Atlas 클러스터) 사용과 관련된 핸들러 작업 수 및 핸들러 작업 기간에 대한 요금을 지불합니다. 최소 요금 및 필수 선불 약정은 없습니다.

새로운 Cloud Control API를 기반으로 무엇을 구축할 수 있을지 정말 기대됩니다. 직접 구축해보세요!

— seb