AWSCDK forTypeScript에 LambdaLayer를 배치하면 이전 버전이 사라집니다.

9480 단어 TypeScriptAWSaws-cdk

입문


이 글은 Type Script Advent Calendar 2019#13일 의 글입니다.
13일째 담당입니다 @is_ryo!

감사 인사


TypeScript 얘기가 아닌데...

시작(2차)


제가 속한 팀은 AWS 구성을 관리하기 위해 AWSCDK를 사용했습니다.
AWSCDK는 TypeScript나 Python 등의 언어로 CloudFormation(이하 CFn)의 템플릿을 생성할 수 있는 개발 패키지입니다.
여기서 AWSCDK 자체에 대한 설명을 생략합니다.자세한 내용은 공식 홈페이지를 참조하십시오.

무슨 일이야..


평소와 같이 TypeScript로 CDK를 쓰기 위해 LambdaLayer를 가져오려고 합니다.
소스 코드가 이런 느낌이에요.
stack.ts
import cdk = require("@aws-cdk/core")

import { LayerVersion, AssetCode, Runtime } from "@aws-cdk/aws-lambda"

export class LambdaLayerStack extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props)

    new LayerVersion(this, "DemoLambdaLayer", {
      code: AssetCode.fromAsset("lambdaSources/demo_function"),
      compatibleRuntimes: [Runtime.NODEJS_12_X]
    })
  }
}
멤버: "네, 소스를 써서 배치해야 돼요!"
$ aws cdk deploy LambdaLayerStack
멤버: "콘솔에서 확인해 주시겠어요?"
콘솔 "배포 가능"

멤버: "Lambda Layer의 논리가 좀 바뀌었어요. 재배치할까요?"
생략
콘솔 "배포 가능"

멤버 "여보세요... 버전 1 어디서 만들었어요?"
콘솔

이유가 뭐예요?


CFn이 범인이야.아니면 CFn의 성질.
스택에 정의되지 않은 자원을 일부러 삭제할 수 있습니다.
예를 들어 APIGAteway에 resource/get/post이 있을 때 이 APIGAteway에 /get 스택만 사용하여 업데이트하면 삭제/post됩니다.
이와 같이 스택을 업데이트할 때 이전 버전의 정보가 없어서 삭제되었습니다...

처리 방법


함부로 지워지지 마.
CFn에서 생성된 리소스에 대한 속성removal policy을 설정할 수 있습니다.
속성을 Retain 로 설정하여 삭제 보호합니다.
이렇게 쓰는 느낌이에요.
stack.ts
import cdk = require("@aws-cdk/core")

import { LayerVersion, AssetCode, Runtime } from "@aws-cdk/aws-lambda"

export class LambdaLayerStack extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props)

    const lambdaLayer = new LayerVersion(this, "DemoLambdaLayer", {
      code: AssetCode.fromAsset("lambdaSources/demo_function"),
      compatibleRuntimes: [Runtime.NODEJS_12_X]
    })
    /* ここから追加 */
    const lambdaLayerResource = lambdaLayer.node.findChild(
      "Resource"
    ) as cdk.CfnResource
    lambdaLayerResource.applyRemovalPolicy(cdk.RemovalPolicy.RETAIN)
  }
}

간단히 설명하다

applyRemovalPolicy 이 함수를 사용하기 위해서는 cdk.CfnResource 을 변수에 넣어야 합니다.
const lambdaLayerResource = lambdaLayer.node.findChild(
  "Resource"
) as cdk.CfnResource
함수 설정 applyRemovalPolicy 을 사용합니다.
기본값은 removal policy 입니다.
lambdaLayerResource.applyRemovalPolicy(cdk.RemovalPolicy.RETAIN)

시도하다


멤버 "배치야!"
콘솔 "배포 가능"

멤버 "이전 버전이 남아있어요!"

마지막


어때?
CFn을 쓰는 사람이 보기에는 당연한 느낌일 수도 있지만, CFn의 해소에 시달리는 것이 있다면 잘 덧붙여보세요DELETE.
그러나 주의해야 할 것은 일단 removal policy배치removal policy되면 CFn은 삭제할 수 없다는 것이다.콘솔에서 제거해야 합니다.
그럼 안녕!

좋은 웹페이지 즐겨찾기