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 |