AWS CDK를 사용하여 인프라 코드를 애플리케이션 개발자에게 더 가까이 제공

14014 단어 cdkaws
AWS Summit Berlin 2022가 5월 11일부터 12일까지 열렸습니다. 그곳에서 저는 AWS의 Gregor Hohpe와 Luis Morales의 Infrastructure as actual code라는 멋진 강연에 참석했습니다. 여기에서 그들은 AWS CDK를 제시했습니다. 한번 해볼 생각을 했고 이 글은 AWS CDK에 대한 나의 첫인상에 대한 글이다.

AWS CDK가 수행하는 작업으로 이동하기 전에 코드형 인프라가 중요한 이유를 살펴보겠습니다. 현재 클라우드 네이티브 애플리케이션 아키텍처에서는 자동화되고 반복 가능하며 일관된 방식으로 인프라를 배포하는 기능이 반드시 필요합니다. 예를 들어 AWS의 CloudFormation, Hashicorp의 terraform 등 많은 도구가 이를 달성할 수 있는 방법을 제공합니다.

그러나 기본적으로 이러한 도구에는 이를 달성하기 위한 자체 DSL이 있습니다. Cloudformation은 YAML/Json 파일을 사용하고 terraform은 HCL(HashiCorp Configuration Language)을 사용합니다.

개발자가 자신이 선호하는 프로그래밍 언어를 사용하여 애플리케이션을 작성하고 전문 지식을 가질 수 있다면 어떨까요? AWS CDK가 빛을 발하는 곳입니다.

AWS CDK를 사용하면 Typescript, JavaScript, Java, Python, Java, C#/.Net 및 Go와 같은 알려진 프로그래밍 언어를 사용할 수 있습니다.

다음은 Api Gateway 통합이 포함된 간단한 Lambda 함수의 모습입니다.

public class MovieLambdaInfraStack extends Stack{
    public MovieLambdaInfraStack(final Construct scope, final String id){
        this(scope, id, null);
    }

    public MovieLambdaInfraStack(final Construct scope, final String id, final StackProps props){
        super(scope, id, props);
        // Parameters
        CfnParameter version = CfnParameter.Builder
                .create(this, "lambda-version")
                .description("Version of lambda app jar")
                .type("String")
                .build();
        // Bucket storing lambda code
        IBucket lambdaCodeBucket = createBucket();

        // Lambda Definition
        String lambdaSource = "movie-lambda-app-" + version.getValueAsString() + ".jar";
        IFunction lambda = Function.Builder.create(this, "sab-lambda-artifact")
                .code(Code.fromBucket(lambdaCodeBucket, lambdaSource))
                .runtime(Runtime.JAVA_11)
                .functionName("sab-lambda-artifact")
                .handler("com.sab.LambdaHandler")
                .tracing(Tracing.ACTIVE)
                .timeout(Duration.minutes(5))
                .memorySize(512)
                .build();

        // Api Gateway

        LambdaIntegration lambdaIntegration = LambdaIntegration.Builder
                .create(lambda)
                .proxy(true)
                .build();

        RestApi api = RestApi.Builder.create(this, "movies")
                .defaultIntegration(lambdaIntegration)
                .apiKeySourceType(ApiKeySourceType.HEADER)
                .build();

        Resource movies = api.getRoot().addResource("movies");
        movies.addMethod("POST");

    }

    @NotNull
    private IBucket createBucket(){
        return Bucket.fromBucketName(this, "lambda-code-bucket", "sab-lambda-artifact");
    }
}


이 스택을 배포하기 위해 AWS CDK에서 실행할 간단한 기본 방법

 public static void main(final String[] args) {
        App app = new App();

        new MovieLambdaInfraStack(app, "MovieLambdaInfraStack", StackProps.builder()
                .env(Environment.builder()
                        .account("xxxxxx")
                        .region("xxxx")
                        .build())
                .build());

        app.synth();
    }


AWS CDK는 이 앱을 AWS에 배포할 cmd line cli와 함께 제공됩니다. 그 아래에 클라우드포메이션 템플릿이 생성됩니다.

AWS CDK 기본 구성 요소



App - AnApp은 cdk에 의해 배포되고 Stacks보다 하나 이상을 포함하는 구성 요소입니다.

스택 - AStack는 우리의 인프라를 정의하는 것입니다. 여기에는 하나 이상이 포함됩니다Constructs.

구성 - 이들은 실제 AWS 서비스입니다. 사용자 지정 구성을 만들 수도 있습니다.

https://docs.aws.amazon.com/cdk/v2/guide/core_concepts.html에서 더 많은 구성 요소를 참조하십시오.

내가 좋아하는 것들



저는 클라우드포메이션을 사용했는데, 복잡한 인프라의 경우 실제로 얽히고 읽기 어려워질 수 있기 때문에 개인적으로 주로 선호하지 않습니다.

최근에 나는 주로 terraform을 사용했고 그것을 좋아했습니다. 다중 클라우드를 지원합니다. 우리는 terraform에서 자체 모듈과 구성 요소를 만들 수 있습니다. HCL 언어는 꽤 표현력이 좋습니다. 함수, 유형, 변수 루프를 정의하는 고유한 방법이 있으며, 이는 때때로 우리 개발자에게 약간 직관적이지 않습니다.

AWS CDK에 대한 첫인상은 다음과 같은 이점이 있습니다.
  • 개발자로서 저는 제가 가장 좋아하고 잘 알려진 프로그래밍 구성을 인프라에 사용할 수 있어 매우 편안합니다.
  • 오래된 Junit을 사용하여 단위 테스트를 작성할 수도 있습니다. 아래는 예시입니다

  •  @Test
        void itShouldGenerateLambda(){
            App app = new App();
            Stack lambda = new MovieLambdaInfraStack(app, "MovieLambdaInfraStack");
            Template template = Template.fromStack(lambda);
            template.resourceCountIs("AWS::Lambda::Function",1);
            template.hasResourceProperties("AWS::Lambda::Function", Map.of(
                    "Handler", "com.sab.LambdaHandler"
            ));
        }
    


  • 객체 지향 프로그래밍 언어를 사용하는 경우 추상화를 최대한 활용할 수 있습니다.
  • 이 추상화 생성 기능은 응용 프로그램 코드 수준에 적용할 수 있는 동일한 도메인 중심 설계 사고를 전달하는 데 도움이 됩니다.
  • 또한 인프라 코드를 작성하는 동안 좋은 추상화 수준을 사용하면 서로 다른 구성 요소가 서로 어떻게 상호 작용하는지 청사진 역할을 할 것입니다. 즉, 애플리케이션의 인프라 구조를 발견할 수 있습니다. 우리는 소프트웨어 수준 아키텍처와 인프라 수준 아키텍처를 한 곳에 나란히 배치할 것입니다. 나는 이것이 우리에게 큰 통찰력을 줄 것이라고 믿습니다.
  • 개발자는 응용 프로그램 코드가 표현하려는 것을 달성하기 위해 인프라 구성 요소가 함께 작동하는 방법을 더 폭넓게 파악할 수 있습니다.

  • 하락세로



    그러나 단점에 -
  • Cloudformation과의 강력한 결합은 이것이 AWS 클라우드 전용임을 의미합니다. terraform용 cdk-tf(https://github.com/hashicorp/terraform-cdk) 및 Kubernetes용 cdk8s와 같은 라이브러리가 있지만 사용할 수 있습니다.
  • 상대적으로 새롭기 때문에 대규모 생산 인프라에서 효율성을 아직 판단하지 못했습니다.

  • 하지만 전반적으로 저는 CDK 접근 방식이 마음에 들었고 이 방식을 채택함으로써 인프라 코드가 애플리케이션 코드에 더 가까워지고 인프라와 애플리케이션 코드 사이의 도구 및 언어 측면에서 사일로가 무너지기를 바랍니다.

    좋은 웹페이지 즐겨찾기