예약 데이터베이스 유지 보수를 수행하는 앱 만들기
예약 데이터베이스 유지 보수를 수행하는 앱 만들기 (Create an app to perform scheduled database maintenance)
AWS Lambda를 사용해 자동 시스템 백업, 파일 변환, 유지 보수 작업 같은 예약 프로세스를 대체할 수 있습니다. 이 예제에서는 오래된 항목을 삭제해 DynamoDB 테이블에서 정기적인 예약 유지 보수를 수행하는 서버리스 애플리케이션을 만듭니다. 앱은 EventBridge Scheduler를 사용해 cron 일정으로 Lambda 함수를 호출합니다. 호출되면 함수는 1년보다 오래된 항목을 테이블에서 쿼리하고 삭제합니다. 함수는 삭제된 각 항목을 CloudWatch Logs에 기록합니다.
이 예제를 구현하려면 먼저 DynamoDB 테이블을 만들고 함수가 쿼리할 테스트 데이터를 채웁니다. 그런 다음 EventBridge Scheduler 트리거와 테이블의 항목을 읽고 삭제할 권한을 함수에 부여하는 IAM 실행 역할이 있는 Python Lambda 함수를 만듭니다.
팁
Lambda가 처음이라면 이 예제 앱을 만들기 전에 튜토리얼 '첫 번째 Lambda 함수 만들기'를 완료할 것을 권장합니다.
AWS Management Console로 리소스를 만들고 구성해 앱을 수동으로 배포할 수 있습니다. AWS Serverless Application Model(AWS SAM)을 사용해 앱을 배포할 수도 있습니다. AWS SAM은 인프라를 코드로(IaC) 관리하는 도구입니다. IaC를 사용하면 리소스를 수동으로 만들지 않고 코드로 정의한 다음 자동으로 배포합니다.
이 예제 앱을 배포하기 전에 Lambda를 IaC와 함께 사용하는 방법을 더 알아보려면 인프라를 코드로(IaC) 사용한 Lambda 사용을 참조하세요.
본문
사전 조건
예제 앱을 만들기 전에 필요한 명령줄 도구와 프로그램이 설치되어 있는지 확인하세요.
- Python — 앱을 테스트하기 위해 만든 DynamoDB 테이블을 채우려면 이 예제는 Python 스크립트와 CSV 파일을 사용해 테이블에 데이터를 씁니다. 머신에 Python 버전 3.8 이상이 설치되어 있는지 확인하세요.
- AWS SAM CLI — AWS SAM을 사용해 DynamoDB 테이블을 만들고 예제 앱을 배포하려면 AWS SAM CLI를 설치해야 합니다. AWS SAM 사용 안내서의 설치 지침을 따르세요.
- AWS CLI — 제공된 Python 스크립트로 테스트 테이블을 채우려면 AWS CLI를 설치하고 구성해야 합니다. 스크립트는 AWS Identity and Access Management(IAM) 자격 증명에 대한 액세스가 필요한 AWS SDK for Python(Boto3)을 사용하기 때문입니다. AWS SAM으로 리소스를 배포하려면 AWS CLI도 필요합니다. AWS Command Line Interface 사용 안내서의 설치 지침에 따라 CLI를 설치하세요.
- Docker — AWS SAM으로 앱을 배포하려면 빌드 머신에 Docker도 설치되어 있어야 합니다. Docker 문서 웹사이트의 Install Docker Engine 지침을 따르세요.
예제 앱 파일 다운로드
예제 데이터베이스와 예약 유지 보수 앱을 만들려면 프로젝트 디렉터리에 다음 파일을 만들어야 합니다.
예제 데이터베이스 파일:
template.yaml— DynamoDB 테이블을 만드는 데 사용할 수 있는 AWS SAM 템플릿sample_data.csv— 테이블에 로드할 샘플 데이터가 포함된 CSV 파일load_sample_data.py— CSV 파일의 데이터를 테이블에 쓰는 Python 스크립트
예약 유지 보수 앱 파일:
lambda_function.py— 데이터베이스 유지 보수를 수행하는 Lambda 함수의 Python 함수 코드requirements.txt— Python 함수 코드에 필요한 종속성을 정의하는 매니페스트 파일template.yaml— 앱을 배포하는 데 사용할 수 있는 AWS SAM 템플릿
테스트 파일:
test_app.py— 테이블을 스캔하고 1년보다 오래된 모든 레코드를 출력해 함수의 성공적인 동작을 확인하는 Python 스크립트
다음 섹션을 확장해 코드를 보고 앱 생성·테스트에서 각 파일의 역할에 대해 자세히 알아보세요. 로컬 머신에서 파일을 만들려면 아래 코드를 복사해 붙여넣으세요.
template.yaml이라는 파일에 다음 코드를 복사해 붙여넣습니다.
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: SAM Template for DynamoDB Table with Order_number as Partition Key and Date as Sort Key
Resources:
MyDynamoDBTable:
Type: AWS::DynamoDB::Table
DeletionPolicy: Retain
UpdateReplacePolicy: Retain
Properties:
TableName: MyOrderTable
BillingMode: PAY_PER_REQUEST
AttributeDefinitions:
- AttributeName: Order_number
AttributeType: S
- AttributeName: Date
AttributeType: S
KeySchema:
- AttributeName: Order_number
KeyType: HASH
- AttributeName: Date
KeyType: RANGE
SSESpecification:
SSEEnabled: true
GlobalSecondaryIndexes:
- IndexName: Date-index
KeySchema:
- AttributeName: Date
KeyType: HASH
Projection:
ProjectionType: ALL
PointInTimeRecoverySpecification:
PointInTimeRecoveryEnabled: true
Outputs:
TableName:
Description: DynamoDB Table Name
Value: !Ref MyDynamoDBTable
TableArn:
Description: DynamoDB Table ARN
Value: !GetAtt MyDynamoDBTable.Arn
참고
AWS SAM 템플릿은
template.yaml이라는 표준 명명 규칙을 사용합니다. 이 예제에는 예제 데이터베이스를 만드는 템플릿과 앱 자체를 만드는 템플릿 두 개가 있습니다. 프로젝트 폴더의 별도 하위 디렉터리에 저장하세요.
이 AWS SAM 템플릿은 앱을 테스트하기 위해 만드는 DynamoDB 테이블 리소스를 정의합니다. 테이블은 Order_number 기본 키와 Date 정렬 키를 사용합니다. Lambda 함수가 항목을 날짜별로 직접 찾을 수 있도록 Date-index라는 글로벌 보조 인덱스(GSI)도 정의합니다.
AWS::DynamoDB::Table 리소스로 DynamoDB 테이블을 만들고 구성하는 방법에 대한 자세한 내용은 AWS CloudFormation 사용 안내서의 AWS::DynamoDB::Table을 참조하세요.
sample_data.csv라는 파일에 다음 코드를 복사해 붙여넣습니다.
Date,Order_number,CustomerName,ProductID,Quantity,TotalAmount
2023-09-01,ORD001,Alejandro Rosalez,PROD123,2,199.98
2023-09-01,ORD002,Akua Mansa,PROD456,1,49.99
2023-09-02,ORD003,Ana Carolina Silva,PROD789,3,149.97
2023-09-03,ORD004,Arnav Desai,PROD123,1,99.99
2023-10-01,ORD005,Carlos Salazar,PROD456,2,99.98
2023-10-02,ORD006,Diego Ramirez,PROD789,1,49.99
2023-10-03,ORD007,Efua Owusu,PROD123,4,399.96
2023-10-04,ORD008,John Stiles,PROD456,2,99.98
2023-10-05,ORD009,Jorge Souza,PROD789,3,149.97
2023-10-06,ORD010,Kwaku Mensah,PROD123,1,99.99
2023-11-01,ORD011,Li Juan,PROD456,5,249.95
2023-11-02,ORD012,Marcia Oliveria,PROD789,2,99.98
2023-11-03,ORD013,Maria Garcia,PROD123,3,299.97
2023-11-04,ORD014,Martha Rivera,PROD456,1,49.99
2023-11-05,ORD015,Mary Major,PROD789,4,199.96
2023-12-01,ORD016,Mateo Jackson,PROD123,2,199.99
2023-12-02,ORD017,Nikki Wolf,PROD456,3,149.97
2023-12-03,ORD018,Pat Candella,PROD789,1,49.99
2023-12-04,ORD019,Paulo Santos,PROD123,5,499.95
2023-12-05,ORD020,Richard Roe,PROD456,2,99.98
2024-01-01,ORD021,Saanvi Sarkar,PROD789,3,149.97
2024-01-02,ORD022,Shirley Rodriguez,PROD123,1,99.99
2024-01-03,ORD023,Sofia Martinez,PROD456,4,199.96
2024-01-04,ORD024,Terry Whitlock,PROD789,2,99.98
2024-01-05,ORD025,Wang Xiulan,PROD123,3,299.97
이 파일은 표준 쉼표로 구분된 값(CSV) 형식으로 DynamoDB 테이블을 채울 예제 테스트 데이터를 포함합니다.
load_sample_data.py라는 파일에 다음 코드를 복사해 붙여넣습니다.
import boto3
import csv
from decimal import Decimal
# Initialize the DynamoDB client
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('MyOrderTable')
print("DDB client initialized.")
def load_data_from_csv(filename):
with open(filename, 'r') as file:
csv_reader = csv.DictReader(file)
for row in csv_reader:
item = {
'Order_number': row['Order_number'],
'Date': row['Date'],
'CustomerName': row['CustomerName'],
'ProductID': row['ProductID'],
'Quantity': int(row['Quantity']),
'TotalAmount': Decimal(str(row['TotalAmount']))
}
table.put_item(Item=item)
print(f"Added item: {item['Order_number']} - {item['Date']}")
if __name__ == "__main__":
load_data_from_csv('sample_data.csv')
print("Data loading completed.")
이 Python 스크립트는 먼저 AWS SDK for Python(Boto3)을 사용해 DynamoDB 테이블에 대한 연결을 만듭니다. 그런 다음 예제 데이터 CSV 파일의 각 행을 반복하며 그 행에서 항목을 만들고 boto3 SDK를 사용해 항목을 DynamoDB 테이블에 씁니다.
lambda_function.py라는 파일에 다음 코드를 복사해 붙여넣습니다.
import boto3
from datetime import datetime, timedelta
from boto3.dynamodb.conditions import Key, Attr
import logging
logger = logging.getLogger()
logger.setLevel("INFO")
def lambda_handler(event, context):
# Initialize the DynamoDB client
dynamodb = boto3.resource('dynamodb')
# Specify the table name
table_name = 'MyOrderTable'
table = dynamodb.Table(table_name)
# Get today's date
today = datetime.now()
# Calculate the date one year ago
one_year_ago = (today - timedelta(days=365)).strftime('%Y-%m-%d')
# Scan the table using a global secondary index
response = table.scan(
IndexName='Date-index',
FilterExpression='#date < :date',
ExpressionAttributeNames={'#date': 'Date'},
ExpressionAttributeValues={':date': one_year_ago}
)
# Iterate over the items and delete items older than one year
deleted_count = 0
for item in response.get('Items', []):
table.delete_item(Key={'Order_number': item['Order_number'], 'Date': item['Date']})
deleted_count += 1
# Handle pagination if the table has more items
while 'LastEvaluatedKey' in response:
response = table.scan(
IndexName='Date-index',
FilterExpression='#date < :date',
ExpressionAttributeNames={'#date': 'Date'},
ExpressionAttributeValues={':date': one_year_ago},
ExclusiveStartKey=response['LastEvaluatedKey']
)
for item in response.get('Items', []):
table.delete_item(Key={'Order_number': item['Order_number'], 'Date': item['Date']})
deleted_count += 1
print(f"Deleted {deleted_count} items older than one year")
Python 함수 코드에는 함수가 호출될 때 Lambda가 실행하는 핸들러 함수(lambda_handler)가 포함되어 있습니다.
EventBridge Scheduler가 함수를 호출하면 예약 유지 보수 작업이 수행될 DynamoDB 테이블에 연결을 만들기 위해 AWS SDK for Python(Boto3)을 사용합니다. 그런 다음 Python datetime 라이브러리를 사용해 1년 전 날짜를 계산한 뒤 이보다 오래된 항목을 테이블에서 스캔해 삭제합니다.
DynamoDB 쿼리 및 스캔 작업의 응답은 크기가 최대 1MB로 제한됩니다. 응답이 1MB보다 크면 DynamoDB는 데이터를 페이지로 나누고 응답에 LastEvaluatedKey 요소를 반환합니다. 함수가 테이블의 모든 레코드를 처리하도록 이 키의 존재를 확인하고 전체 테이블을 스캔할 때까지 마지막 평가 위치에서 테이블 스캔을 계속 수행합니다.
requirements.txt라는 파일에 다음 코드를 복사해 붙여넣습니다.
boto3
이 예제에서 함수 코드에는 표준 Python 라이브러리의 일부가 아닌 종속성이 하나뿐입니다. 바로 함수가 DynamoDB 테이블에서 항목을 스캔하고 삭제하는 데 사용하는 SDK for Python(Boto3)입니다.
참고
SDK for Python(Boto3) 버전이 Lambda 런타임의 일부로 포함되어 있으므로 함수의 배포 패키지에 Boto3를 추가하지 않아도 코드가 실행됩니다. 그러나 함수의 종속성을 완전히 제어하고 버전 불일치로 인한 문제를 피하려면 Python의 모범 사례는 모든 함수 종속성을 함수의 배포 패키지에 포함하는 것입니다. 자세한 내용은 Python의 런타임 종속성을 참조하세요.
template.yaml이라는 파일에 다음 코드를 복사해 붙여넣습니다.
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: SAM Template for Lambda function and EventBridge Scheduler rule
Resources:
MyLambdaFunction:
Type: AWS::Serverless::Function
Properties:
FunctionName: ScheduledDBMaintenance
CodeUri: ./
Handler: lambda_function.lambda_handler
Runtime: python3.11
Architectures:
- x86_64
Events:
ScheduleEvent:
Type: ScheduleV2
Properties:
ScheduleExpression: cron(0 3 1 * ? *)
Description: Run on the first day of every month at 03:00 AM
Policies:
- CloudWatchLogsFullAccess
- Statement:
- Effect: Allow
Action:
- dynamodb:Scan
- dynamodb:BatchWriteItem
Resource: !Sub 'arn:aws:dynamodb:${AWS::Region}:${AWS::AccountId}:table/MyOrderTable'
LambdaLogGroup:
Type: AWS::Logs::LogGroup
Properties:
LogGroupName: !Sub /aws/lambda/${MyLambdaFunction}
RetentionInDays: 30
Outputs:
LambdaFunctionName:
Description: Lambda Function Name
Value: !Ref MyLambdaFunction
LambdaFunctionArn:
Description: Lambda Function ARN
Value: !GetAtt MyLambdaFunction.Arn
참고
AWS SAM 템플릿은
template.yaml이라는 표준 명명 규칙을 사용합니다. 이 예제에는 예제 데이터베이스를 만드는 템플릿과 앱 자체를 만드는 템플릿 두 개가 있습니다. 프로젝트 폴더의 별도 하위 디렉터리에 저장하세요.
이 AWS SAM 템플릿은 앱의 리소스를 정의합니다. AWS::Serverless::Function 리소스로 Lambda 함수를 정의합니다. 이 리소스의 Events 속성에서 ScheduleV2 유형을 사용해 EventBridge Scheduler 일정과 Lambda 함수를 호출하는 트리거를 만듭니다. AWS SAM 템플릿에서 EventBridge Scheduler 일정 정의에 대해 자세히 알아보려면 AWS Serverless Application Model 개발자 안내서의 ScheduleV2를 참조하세요.
Lambda 함수와 EventBridge Scheduler 일정 외에도 삭제된 항목의 레코드를 보낼 함수용 CloudWatch 로그 그룹도 정의합니다.
test_app.py라는 파일에 다음 코드를 복사해 붙여넣습니다.
import boto3
from datetime import datetime, timedelta
import json
# Initialize the DynamoDB client
dynamodb = boto3.resource('dynamodb')
# Specify your table name
table_name = 'YourTableName'
table = dynamodb.Table(table_name)
# Get the current date
current_date = datetime.now()
# Calculate the date one year ago
one_year_ago = current_date - timedelta(days=365)
# Convert the date to string format (assuming the date in DynamoDB is stored as a string)
one_year_ago_str = one_year_ago.strftime('%Y-%m-%d')
# Scan the table
response = table.scan(
FilterExpression='#date < :date',
ExpressionAttributeNames={'#date': 'Date'},
ExpressionAttributeValues={':date': one_year_ago_str}
)
# Print the number of records older than one year
old_records = response.get('Items', [])
print(f"Total number of old records: {len(old_records)}")
이 테스트 스크립트는 AWS SDK for Python(Boto3)을 사용해 DynamoDB 테이블에 대한 연결을 만들고 1년보다 오래된 항목을 스캔합니다. Lambda 함수가 성공적으로 실행되었는지 확인하기 위해 테스트가 끝나면 테이블에 1년보다 오래 남은 레코드 수를 출력합니다. Lambda 함수가 성공했다면 테이블의 오래된 레코드 수는 0이어야 합니다.
예제 DynamoDB 테이블 만들기 및 채우기
예약 유지 보수 앱을 테스트하려면 먼저 DynamoDB 테이블을 만들고 일부 샘플 데이터로 채웁니다. AWS Management Console을 사용해 수동으로 만들거나 AWS SAM을 사용해 테이블을 만들 수 있습니다. 몇 가지 AWS CLI 명령으로 테이블을 빠르게 만들고 구성하려면 AWS SAM을 사용할 것을 권장합니다.
콘솔로 DynamoDB 테이블 만들기:
- DynamoDB 콘솔의 Tables(테이블) 페이지를 엽니다.
- Create table(테이블 생성) 을 선택합니다.
- 다음을 수행해 테이블을 만듭니다:
- Table details(테이블 세부 정보) 아래에서 Table name(테이블 이름) 으로
MyOrderTable을 입력합니다. - Partition key(파티션 키) 로
Order_number를 입력하고 유형은 String으로 둡니다. - Sort key(정렬 키) 로
Date를 입력하고 유형은 String으로 둡니다. - Table settings(테이블 설정) 을 Default settings로 두고 Create table 을 선택합니다.
- Table details(테이블 세부 정보) 아래에서 Table name(테이블 이름) 으로
- 테이블 생성이 완료되고 Status가 Active로 표시되면 다음을 수행해 글로벌 보조 인덱스(GSI)를 만듭니다. 앱은 이 GSI를 사용해 항목을 날짜별로 직접 검색해 삭제할 항목을 결정합니다.
- 테이블 목록에서 MyOrderTable 을 선택합니다.
- Indexes(인덱스) 탭을 선택합니다.
- Global secondary indexes(글로벌 보조 인덱스) 아래에서 Create index(인덱스 생성) 를 선택합니다.
- Index details(인덱스 세부 정보) 아래에서 Partition key(파티션 키) 로
Date를 입력하고 Data type(데이터 유형) 은 String으로 둡니다. - Index name(인덱스 이름) 으로
Date-index를 입력합니다. - 다른 모든 파라미터는 기본값으로 두고 페이지 아래로 스크롤해 Create index 를 선택합니다.
AWS SAM으로 DynamoDB 테이블 만들기:
- DynamoDB 테이블용
template.yaml파일을 저장한 폴더로 이동합니다. 이 예제는template.yaml파일 두 개를 사용한다는 점에 유의하세요. 별도 하위 폴더에 저장했는지, DynamoDB 테이블을 만들 템플릿이 들어 있는 올바른 폴더에 있는지 확인하세요. - 다음 명령을 실행합니다.
sam build
이 명령은 배포하려는 리소스의 빌드 아티팩트를 모아 배포할 수 있는 올바른 형식과 위치에 배치합니다.
template.yaml파일에 지정된 DynamoDB 리소스를 만들려면 다음 명령을 실행합니다.
sam deploy --guided
--guided 플래그를 사용하면 AWS SAM이 배포 프로세스를 안내하는 프롬프트를 표시합니다. 이 배포에서는 Stack name으로 cron-app-test-db를 입력하고 다른 모든 옵션은 Enter를 눌러 기본값을 수락합니다.
- AWS SAM이 DynamoDB 리소스 생성을 마치면 다음 메시지가 표시되어야 합니다.
Successfully created/updated stack - cron-app-test-db in us-west-2
- DynamoDB 콘솔의 Tables 페이지를 열어 테이블이 생성되었는지 추가로 확인할 수 있습니다.
MyOrderTable이라는 이름의 테이블이 보여야 합니다.
테이블을 만든 후 다음으로 앱을 테스트할 샘플 데이터를 추가합니다. 앞서 다운로드한 CSV 파일 sample_data.csv에는 주문 번호, 날짜, 고객 및 주문 정보로 구성된 여러 예제 항목이 포함되어 있습니다. 제공된 Python 스크립트 load_sample_data.py를 사용해 이 데이터를 테이블에 추가하세요.
테이블에 샘플 데이터 추가:
sample_data.csv와load_sample_data.py파일이 있는 디렉터리로 이동합니다. 이 파일들이 별도 디렉터리에 있으면 같은 위치에 저장되도록 옮기세요.- 다음 명령을 실행해 스크립트를 실행할 Python 가상 환경을 만듭니다. 다음 단계에서 AWS SDK for Python(Boto3)을 설치해야 하므로 가상 환경 사용을 권장합니다.
python -m venv venv
- 다음 명령을 실행해 가상 환경을 활성화합니다.
source venv/bin/activate
- 다음 명령을 실행해 가상 환경에 SDK for Python(Boto3)을 설치합니다. 스크립트는 이 라이브러리를 사용해 DynamoDB 테이블에 연결하고 항목을 추가합니다.
pip install boto3
- 다음 명령을 실행해 테이블을 채울 스크립트를 실행합니다.
python load_sample_data.py
스크립트가 성공적으로 실행되면 각 항목을 로드할 때마다 콘솔에 출력하고 마지막에 Data loading completed를 보고해야 합니다.
- 다음 명령을 실행해 가상 환경을 비활성화합니다.
deactivate
- 데이터가 DynamoDB 테이블에 로드되었는지 다음과 같이 확인할 수 있습니다:
- DynamoDB 콘솔의 Explore items(항목 탐색) 페이지를 열고 테이블(
MyOrderTable)을 선택합니다. - Items returned(반환된 항목) 창에서 스크립트가 테이블에 추가한 CSV 파일의 25개 항목이 보여야 합니다.
- DynamoDB 콘솔의 Explore items(항목 탐색) 페이지를 열고 테이블(
예약 유지 보수 앱 만들기
AWS Management Console을 사용하거나 AWS SAM을 사용해 이 예제 앱의 리소스를 단계별로 만들고 배포할 수 있습니다. 프로덕션 환경에서는 AWS SAM 같은 인프라를 코드로(IaC) 관리하는 도구를 사용해 수동 프로세스 없이 서버리스 애플리케이션을 반복적으로 배포할 것을 권장합니다.
이 예제에서는 각 AWS 리소스를 개별적으로 구성하는 방법을 배우려면 콘솔 지침을 따르거나, AWS CLI 명령으로 앱을 빠르게 배포하려면 AWS SAM 지침을 따르세요.
AWS Management Console로 함수 만들기:
먼저 기본 스타터 코드가 포함된 함수를 만듭니다. 그런 다음 Lambda 코드 편집기에 코드를 복사해 붙여넣거나 .zip 패키지로 코드를 업로드해 이 코드를 자체 함수 코드로 교체합니다. 이 작업에서는 코드를 복사해 붙여넣는 것을 권장합니다.
- Lambda 콘솔의 Functions(함수) 페이지를 엽니다.
- Create function(함수 생성) 을 선택합니다.
- Author from scratch(처음부터 작성) 를 선택합니다.
- Basic information(기본 정보) 아래에서 다음을 수행합니다:
- Function name(함수 이름) 으로
ScheduledDBMaintenance를 입력합니다. - Runtime(런타임) 에서 최신 Python 버전을 선택합니다.
- Architecture(아키텍처) 에서 x86_64를 선택합니다.
- Function name(함수 이름) 으로
- Create function 을 선택합니다.
- 함수가 생성된 후 제공된 함수 코드로 함수를 구성할 수 있습니다.
- Code source(코드 소스) 창에서 Lambda가 만든 Hello world 코드를 앞서 저장한
lambda_function.py파일의 Python 함수 코드로 교체합니다. - DEPLOY(배포) 섹션에서 Deploy 를 선택해 함수의 코드를 업데이트합니다.
- Code source(코드 소스) 창에서 Lambda가 만든 Hello world 코드를 앞서 저장한
함수 메모리와 타임아웃 구성 (콘솔):
- 함수의 Configuration(구성) 탭을 선택합니다.
- General configuration(일반 구성) 창에서 Edit(편집) 을 선택합니다.
- Memory(메모리) 를 256MB로, Timeout(타임아웃) 을 15초로 설정합니다.
- 많은 레코드가 있는 큰 테이블을 처리하는 경우(예: 프로덕션 환경) Timeout 을 더 큰 숫자로 설정하는 것을 고려할 수 있습니다. 이렇게 하면 함수가 데이터베이스를 스캔하고 정리할 시간이 더 많아집니다.
- Save(저장) 를 선택합니다.
로그 형식 구성 (콘솔):
Lambda 함수가 비구조화된 텍스트 또는 JSON 형식으로 로그를 출력하도록 구성할 수 있습니다. 로그 데이터를 더 쉽게 검색하고 필터링하려면 로그에 JSON 형식을 사용할 것을 권장합니다. Lambda 로그 구성 옵션에 대해 자세히 알아보려면 Lambda 함수에 대한 고급 로깅 제어 구성을 참조하세요.
- 함수의 Configuration 탭을 선택합니다.
- Monitoring and operations tools(모니터링 및 운영 도구) 를 선택합니다.
- Logging configuration(로깅 구성) 창에서 Edit 을 선택합니다.
- Logging configuration 에서 JSON 을 선택합니다.
- Save 를 선택합니다.
IAM 권한 설정:
함수에 DynamoDB 항목을 읽고 삭제하는 데 필요한 권한을 부여하려면 함수의 실행 역할에 필요한 권한을 정의하는 정책을 추가해야 합니다.
- Configuration 탭을 연 다음 왼쪽 탐색 창에서 Permissions(권한) 을 선택합니다.
- Execution role(실행 역할) 아래의 역할 이름을 선택합니다.
- IAM 콘솔에서 Add permissions(권한 추가) 를 선택한 다음 Create inline policy(인라인 정책 생성) 를 선택합니다.
- JSON 편집기를 사용해 다음 정책을 입력합니다:
{
"Version":"2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"dynamodb:Scan",
"dynamodb:DeleteItem",
"dynamodb:BatchWriteItem"
],
"Resource": "arn:aws:dynamodb:*:*:table/MyOrderTable"
}
]
}
- 정책 이름을
DynamoDBCleanupPolicy로 지정한 다음 만듭니다.
EventBridge Scheduler를 트리거로 설정 (콘솔):
- Lambda 콘솔의 Functions 페이지를 엽니다.
- 함수(
ScheduledDBMaintenance)를 선택합니다. - Function overview(함수 개요) 창에서 Add trigger(트리거 추가) 를 선택합니다.
- 트리거 소스 드롭다운에서 Scheduler 를 선택합니다.
- 다음을 수행해 일정을 구성합니다:
- Schedule name(일정 이름) 으로
DynamoDBCleanupSchedule을 입력합니다. - Schedule group(일정 그룹) 은 기본값(
default)으로 둡니다. - Schedule type(일정 유형) 에서 Recurring schedule(반복 일정) 을 선택하고 다음 cron 표현식을 입력합니다:
cron(0 3 1 * ? *). - 평가될 때 이 cron 표현식은 매월 1일 03:00에 실행됩니다.
- Flexible time window(유연한 시간 창) 에서 Off 를 선택합니다.
- Payload 필드는 비워 둡니다.
- 실행 역할에서 Create new role for this schedule(이 일정에 대한 새 역할 만들기) 을 선택하고 역할 이름을 입력합니다. EventBridge Scheduler가 일정이 함수를 호출하는 데 필요한 권한이 있는 새 정책을 만듭니다.
- Schedule name(일정 이름) 으로
- Add 를 선택합니다.
AWS SAM으로 앱 배포:
- 앱용
template.yaml파일을 저장한 폴더로 이동합니다. 이 예제는template.yaml파일 두 개를 사용한다는 점에 유의하세요. 별도 하위 폴더에 저장했는지, 앱을 만들 템플릿이 들어 있는 올바른 폴더에 있는지 확인하세요. - 앞서 다운로드한
lambda_function.py와requirements.txt파일을 같은 폴더에 복사합니다. AWS SAM 템플릿에 지정된 코드 위치는./로 현재 위치를 의미합니다. 앱을 배포할 때 AWS SAM은 Lambda 함수 코드를 이 폴더에서 검색합니다. - 다음 명령을 실행합니다.
sam build --use-container
이 명령은 배포하려는 리소스의 빌드 아티팩트를 모아 배포할 수 있는 올바른 형식과 위치에 배치합니다. --use-container 옵션을 지정하면 Lambda와 유사한 Docker 컨테이너 안에서 함수를 빌드합니다. 빌드가 동작하기 위해 로컬 머신에 Python 3.12를 설치할 필요가 없도록 여기서 이것을 사용합니다.
template.yaml파일에 지정된 Lambda 및 EventBridge Scheduler 리소스를 만들려면 다음 명령을 실행합니다.
sam deploy --guided
--guided 플래그를 사용하면 AWS SAM이 배포 프로세스를 안내하는 프롬프트를 표시합니다. 이 배포에서는 Stack name으로 cron-maintenance-app을 입력하고 다른 모든 옵션은 Enter를 눌러 기본값을 수락합니다.
- AWS SAM이 Lambda 및 EventBridge Scheduler 리소스 생성을 마치면 다음 메시지가 표시되어야 합니다.
Successfully created/updated stack - cron-maintenance-app in us-west-2
- Lambda 콘솔의 Functions 페이지를 열어 Lambda 함수가 생성되었는지 추가로 확인할 수 있습니다.
ScheduledDBMaintenance라는 이름의 함수가 보여야 합니다.
앱 테스트
일정이 함수를 올바르게 트리거하고 함수가 데이터베이스에서 레코드를 올바르게 정리하는지 테스트하려면 특정 시간에 한 번 실행되도록 일정을 임시로 수정할 수 있습니다. 그런 다음 sam deploy를 다시 실행해 반복 일정을 월 1회 실행되도록 재설정할 수 있습니다.
AWS Management Console로 애플리케이션 실행:
- Lambda 콘솔의 Functions 페이지를 엽니다.
- 함수(
ScheduledDBMaintenance)를 선택합니다. - Triggers(트리거) 섹션에서
DynamoDBCleanupSchedule트리거를 선택합니다. - Edit 을 선택합니다.
- Schedule type 에서 One-time schedule(일회성 일정) 을 선택합니다.
- 호출 시간을 지금부터 몇 분 후로 설정한 다음 Save 를 선택합니다.
일정이 실행되어 대상을 호출한 후 test_app.py 스크립트를 실행해 함수가 DynamoDB 테이블에서 모든 오래된 레코드를 성공적으로 제거했는지 확인합니다.
Python 스크립트로 오래된 레코드가 삭제되었는지 확인:
- 명령줄에서
test_app.py를 저장한 폴더로 이동합니다. - 스크립트를 실행합니다.
python test_app.py
- 성공하면 다음 출력이 표시됩니다.
Total number of old records: 0
다음 단계
이제 EventBridge Scheduler 일정을 수정해 특정 애플리케이션 요구 사항을 충족할 수 있습니다. EventBridge Scheduler는 cron, rate, 일회성 일정 등 다음 일정 표현식을 지원합니다.
EventBridge Scheduler 일정 표현식에 대한 자세한 내용은 EventBridge Scheduler 사용 안내서의 일정 유형을 참조하세요.
더 알아보기 (Learn more)
- EventBridge Scheduler로 Lambda 함수 예약 호출
- DynamoDB 테이블 생성 및 관리
- AWS SAM으로 Lambda 배포