【AWS-CDK】인증 첨부 ​​WebAPI를 Solutions Constructs를 사용해 간편하게 구축

Solutions Constructs로 AWS 인프라 구축



요 전날 AWS Solutions Constructs이 발표되었습니다. 이것은 AWS-CDK에서 추상화된 리소스를 나타내는 Constructs 의 자주(잘) 사용하는 조합을 Well-Architected 준거의 설정 포함으로 한발로 구축할 수 있는 라이브러리입니다. 예를 들면 Lambda + DynamoDB 이나 CloudFront + S3 와 같은 조합의 패턴이 25개(2020/7월 현재) 제공되고 있습니다.
  • htps : // / cs. 아 ws. 아마존. 코 m/소치온 s/아 st/안 st 루 cts/아피-레후렌세. HTML

  • 이것을 사용하여 아빠와 AWS에 WebAPI를 구축하고 싶습니다.

    주의



    2020 년 7 월 6 일 현재 Solutions Constructs의 모든 안정성은 Experimental입니다.
    프로덕션 환경 등에서의 사용은 잘 검토한 후 실시해 주십시오.

    환경


  • AWS-CDK CLI v1.47.0
  • ※ Solutions Construcs는 CDK v1.46.0 이상을 지원합니다.

  • TypeScript v3.9.2
  • npm v6.14.5
  • node.js v12.18.0

  • 사용할 Constructs



    이번에는 다음 Solutions Constructs를 사용합니다.
  • aws-cognito-apigateway-lambda
  • aws-lambda-dynamodb

  • 구성도는 다음과 같습니다.



    CDK는 API Gateway, Lambda, Cognito, DynamoDB 테이블을 만듭니다.
    또한 각 리소스의 옵션은 기본적으로 아래의 Well-Architected 준수 설정이되어 있습니다.
  • Cognito
  • 사용자 풀에 대한 암호 정책 설정
  • 사용자 풀에 대한 고급 보안 사용

  • API 게이트웨이
  • 엔드포인트의 에지 최적화 설정
  • 액세스 로그 사용
  • 최소 IAM 역할 설정
  • 모든 메소드에 대한 IAM 인증 설정

  • Lambda
  • 최소 IAM 역할 설정
  • 로그 출력 사용
  • keep-alive시 연결 재사용 설정 (Node.js 함수)

  • DynamoDB
  • 온 디맨드 모드 설정
  • AWS Managed CMK를 사용한 암호화 설정


  • 작성 절차



    AWS-CDK CLI를 전역 설치합니다.
    npm install -g aws-cdk
    

    설치 후 프로젝트를 만듭니다.
    cdk init app --language=typescript
    

    이번에 사용할 라이브러리를 설치합니다. (SolutionsConstructs의 최신 ver가 1.47.0이므로 통일)
    npm install -s @aws-cdk/[email protected] @aws-cdk/[email protected] @aws-cdk/[email protected] @aws-cdk/[email protected] @aws-solutions-constructs/[email protected] @aws-solutions-constructs/[email protected]
    

    Constructs를 사용하여 CDK를 작성합니다.
    import * as cdk from "@aws-cdk/core";
    import * as lambda from "@aws-cdk/aws-lambda";
    import { CognitoToApiGatewayToLambda } from "@aws-solutions-constructs/aws-cognito-apigateway-lambda";
    import { LambdaToDynamoDB } from "@aws-solutions-constructs/aws-lambda-dynamodb";
    import {
      AttributeType,
      BillingMode,
      TableEncryption,
    } from "@aws-cdk/aws-dynamodb";
    
    export class CdkWebappStack extends cdk.Stack {
      constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
        super(scope, id, props);
    
        // The code that defines your stack goes here
        const apigwToLambda = new CognitoToApiGatewayToLambda(
          this,
          "CognitoToApiGatewayToLambdaPattern",
          {
            deployLambda: true,
            lambdaFunctionProps: {
              runtime: lambda.Runtime.NODEJS_12_X,
              handler: "index.handler",
              code: lambda.Code.asset(`${__dirname}/lambda`),
            },
          }
        );
    
        new LambdaToDynamoDB(this, "LambdaToDynamoPattern", {
          deployLambda: false,
          existingLambdaObj: apigwToLambda.lambdaFunction, // 生成済みのLambdaを使用
          dynamoTableProps: {
            partitionKey: { name: "id", type: AttributeType.STRING },
            // デフォルトの設定は以下の通り
            //   キャパシティーモード: オンデマンド
            //   暗号化タイプ: KMS - AWSマネージドCMK
            // 無料枠で使用するために設定を変更している。
            billingMode: BillingMode.PROVISIONED,
            readCapacity: 5,
            writeCapacity: 5,
            encryption: TableEncryption.DEFAULT,
          },
        });
      }
    }
    

    lib/lambda 디렉토리에는 lambda의 소스를 배치합니다.

    index.js
    const { DynamoDB } = require("aws-sdk");
    
    exports.handler = async function (event) {
      console.log("request:", JSON.stringify(event, undefined, 2));
    
      // create AWS SDK clients
      const dynamo = new DynamoDB();
    
      // APIのパスをパーティションキーとして、アクセス回数を記録する
      await dynamo
        .updateItem({
          TableName: process.env.DDB_TABLE_NAME,
          Key: { id: { S: event.path } },
          UpdateExpression: "ADD hits :incr",
          ExpressionAttributeValues: { ":incr": { N: "1" } },
        })
        .promise();
    
      return {
        statusCode: 200,
        headers: { "Content-Type": "text/plain" },
        body: `Hello, AWS Solutions Constructs! You've hit ${event.path}\n`,
      };
    };
    
    

    다음 명령으로 인프라를 배포할 수 있습니다.
    npm run build && cdk deploy
    
    cdk deploy 런타임에 리소스 배포 확인이 있으므로 y를 입력하여 배포를 시작합니다.

    API Gateway 콘솔에서 /foo 메서드를 테스트하면 성공적으로 응답이 반환되는지 확인할 수 있습니다.



    또한 DynamoDB에 액세스한 경로의 문자열과 액세스 횟수가 기록되어 있는지 확인할 수 있습니다.



    요약



    이와 같이 Solution Constructs에서는 AWS에서 자주 사용되는 리소스 조합을 Constructs를 통해 제공해 줍니다. 이를 이용하면 폭속으로 지금까지보다 빠르고 Well-Architected에 준거한 인프라를 구축할 수 있게 되었습니다.

    참고


  • AWS Solutions Constructs - Walkthrough - Part 1
  • AWS Solutions Constructs - Walkthrough - Part 2
  • 【AWS CDK】 AWS 아키텍트가 작성한 Contructs를 사용할 수 있는 AWS Solutions Constructs가 나왔습니다!
  • 좋은 웹페이지 즐겨찾기