AWS/AWS 공부

[CDK] CDK Lambda 함수 배포

Yuco 2023. 3. 29. 19:30

 

1. cdk build + cdk deploy 

 

아래 cdk.App() 객체를 생성해줌으로써 cdk로 아래 람다 함수 Stack을 사용하여 람다 함수를 배포할 수 있습니다.

import 'source-map-support/register'
import * as cdk from 'aws-cdk-lib'
import {CreateLambdaStack} from "../lib/lambdaFunction";

require('dotenv').config()

const functionName = "TestLambdaFunction"

const app = new cdk.App()

new CreateLambdaStack(app, functionName, {
    account: process.env.ACCOUNT,
    region: process.env.REGION,
})

 

아래 aws_lambda.Function()을 통해 lambda/ 경로에 있는 람다 함수를 배포할 수 있습니다. 람다 함수가 사용할 아키텍처 등을 cdk 생성 시 설정해줄 수 있습니다. 

또한 iam.PolicyStatement를 통해 람다 함수가 필요한 정책을 설정해 줄 수 있습니다. 아래는 시크릿 매니저의 값을 가져오는 정책과 S3 버켓의 값을 가져오고, 넣을 수 있는 정책을 설정해주었습니다. 

 

import { Construct } from 'constructs'
import * as cdk from 'aws-cdk-lib'
import * as iam from 'aws-cdk-lib/aws-iam'

export class CreateLambdaStack extends cdk.Stack {
    constructor(scope: Construct, id: string, customProps: CustomStackProps, props?: cdk.StackProps) {
        super(scope, id, props)

        const lambdaFunc = new cdk.aws_lambda.Function(this, id, {
            functionName: id,
            code: cdk.aws_lambda.Code.fromAsset('lambda/lambda_func'),
            runtime: cdk.aws_lambda.Runtime.PYTHON_3_10,
            handler: 'app.lambda_handler',
            architecture: cdk.aws_lambda.Architecture.ARM_64
        })
		
        // 시크릿 매니저 권한 
        const smPolicy = new iam.PolicyStatement({
            effect: iam.Effect.ALLOW,
            actions: ['secretsmanager:GetSecretValue'],
            resources: ['*'],
        })
		
        // 람다에 권한 추가
        lambdaFunc.addToRolePolicy(smPolicy)
        
	
        // s3 버킷 권한
        const s3Policy = new iam.PolicyStatement({
            effect: iam.Effect.ALLOW,
            actions: ['s3:GetObject', 's3:PutObject', 's3:PutObjectAcl'],
            resources: ['arn:aws:s3:::995377706560-tenant-kimsiljang-test/*'],
        })
		
        // 람다에 권한 추가
        lambdaFunc.addToRolePolicy(s3Policy)
		
        // function arn 출력
        new cdk.CfnOutput(this, 'lambdaFunc', {
            description: 'lambdaFunc Function',
            value: lambdaFunc.functionArn,
        })

    }
}

위 코드는 cdk build & cdk deploy를 통해 배포할 수 있습니다.

 

2. sam build + cdk deploy

아래 코드는 sam build 시 lambda/ 경로에 있는 app.py의 lambda_handler 함수를 빌드하기 위한 template.yaml 파일입니다. LambdaFunction을 생성하고, 생성된 람다 함수가 CloudWatch 로그 그룹을 생성하고 로그를 찍을 수 있는 권한을 줍니다.

cdk build 와 다른점은 sam build 시 빌드 된 .aws-sam/build/LambdaFunction을 가지고 CDK로 람다를 배포한다는 것입니다. 

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >

  Sample SAM Template for sam build cdk deploy

Globals:
  Function:
    Timeout: 900
    MemorySize: 256

Resources:
  LambdaFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: LambdaTestFunction
      Architectures:
        - arm64
      CodeUri: lambda/
      Handler: app.lambda_handler
      MemorySize: 128
      PackageType: Zip
      Runtime: python3.10
  LambdaFunctionPolicy:
    Type: AWS::IAM::Policy
    Properties:
      PolicyName: LambdaFunctionPolicy
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Action:  // 클라우드 워치 로그 권한 추가
              - cloudwatch:CreateLogGroup
              - cloudwatch:CreateLogStream
              - cloudwatch:PutLogEvents
            Resource: "*"

 

import { Construct } from 'constructs'
import * as cdk from 'aws-cdk-lib'
import * as iam from 'aws-cdk-lib/aws-iam'

export interface CustomStackProps {
    secretsManagerArn: string,
}


export class CreateLambdaStack extends cdk.Stack {
    constructor(scope: Construct, id: string, customProps: CustomStackProps, props?: cdk.StackProps) {
        super(scope, id, props)

        const lambdaFunc = new cdk.aws_lambda.Function(this, id, {
            functionName: id,
            code: cdk.aws_lambda.Code.fromAsset('.aws-sam/build/LambdaFuncton'),
            runtime: cdk.aws_lambda.Runtime.PYTHON_3_10,
            handler: 'app.lambda_handler',
            architecture: cdk.aws_lambda.Architecture.ARM_64,
            environment: {
                SECRETS_MANAGER_ARN: customProps.secretsManagerArn
            }
        })
		
        // 시크릿 매니저 권한 
        const smPolicy = new iam.PolicyStatement({
            effect: iam.Effect.ALLOW,
            actions: ['secretsmanager:GetSecretValue'],
            resources: ['*'],
        })
		
        // 람다에 권한 추가
        lambdaFunc.addToRolePolicy(smPolicy)
        
		// s3 버킷 권한
        const s3Policy = new iam.PolicyStatement({
            effect: iam.Effect.ALLOW,
            actions: ['s3:GetObject', 's3:PutObject', 's3:PutObjectAcl'],
            resources: ['arn:aws:s3:::995377706560-tenant-kimsiljang-test/*'],
        })
		
        // 람다에 권한 추가
        lambdaFunc.addToRolePolicy(s3Policy)
		
        // function arn 출력
        new cdk.CfnOutput(this, 'lambdaFunc', {
            description: 'lambdaFunc Function',
            value: lambdaFunc.functionArn,
        })

    }
}

 

또한 람다 함수에 enviromment를 줌으로써, 람다 함수 배포시 환경 변수를 줄 수 있습니다.

environment: {
    SECRETS_MANAGER_ARN: customProps.secrets_manager_arn
}

'AWS > AWS 공부' 카테고리의 다른 글

[AWS] VPC(Virtual Private Cloud), 서브넷(Subnet)  (0) 2023.06.17
[AWS] 리전과 가용영역  (0) 2023.06.17
[CDK] Stack 배포 시 Url 생성  (0) 2023.03.31
[CDK] DynamoDB 권한 추가  (0) 2023.03.31
[CDK] 개념 정리  (0) 2023.03.29