AWS Lambda는 서버 없이 코드를 실행할 수 있는 서비스로, 이벤트 트리거에 응답하여 코드를 자동으로 실행합니다. Lambda 함수는 다양한 이벤트 소스에서 실행될 수 있으며, 예를 들어 S3 버킷에 새로운 파일이 업로드되면 Lambda 함수를 트리거하여 파일을 처리할 수 있습니다.
람다 핸들러 (Lambda Handler)는 AWS Lambda 함수의 진입점(entry point)으로서, 함수가 실행될 때 호출되는 함수입니다. 핸들러는 Lambda 함수의 실행 흐름을 시작하고 이벤트 데이터를 처리하는 역할을 합니다. 이 핸들러 함수는 Lambda 함수를 정의할 때 지정하며, 특별한 형식을 가지고 있습니다.
람다 핸들러의 주요 역할은 다음과 같습니다:
진입점 함수: 람다 함수의 실행 시작점으로 핸들러 함수가 호출됩니다. 함수가 실행될 때, AWS Lambda는 핸들러 함수를 자동으로 찾아 호출하게 됩니다.
이벤트 및 컨텍스트 처리: 핸들러 함수는 이벤트 객체와 컨텍스트 객체를 매개변수로 받습니다. 이벤트 객체는 함수를 트리거한 이벤트에 관한 정보를 포함하고, 컨텍스트 객체는 함수의 실행 환경 정보를 제공합니다.
비즈니스 로직 수행: 핸들러 함수는 받은 이벤트를 처리하고 비즈니스 로직을 수행합니다. 예를 들어, S3 이벤트인 경우, 핸들러는 S3 버킷에서 새로운 파일을 가져와 처리할 수 있습니다.
결과 반환: 핸들러 함수는 실행 결과를 반환하거나, 예외를 던지거나, Promise를 반환하여 함수의 실행이 성공적으로 완료되었음을 나타냅니다. 핸들러 함수는 특정 이벤트 유형에 대한 로직을 수행하고 결과를 반환합니다.
Lambda 함수의 핵심은 핸들러 함수입니다. 핸들러 함수는 Lambda 함수의 진입점 역할을 하며 이벤트 및 컨텍스트를 받아서 처리합니다. 핸들러 함수는 Lambda 함수의 코드에서 정의되며 일반적으로 다음과 같은 형식을 가집니다.
exports.handler = async (event, context) => {
// 이벤트 데이터 출력
console.log("Received event:", JSON.stringify(event, null, 2));
// Lambda 실행 정보 출력
console.log("Function name:", context.functionName);
console.log("Remaining time (ms):", context.getRemainingTimeInMillis());
// 이벤트를 기반으로 한 처리
const response = {
statusCode: 200,
body: JSON.stringify({ message: "Hello from Lambda!" })
};
return response;
};
다음은 S3 이벤트를 처리하는 간단한 람다 핸들러 예제입니다. 이 핸들러는 S3 버킷에 새로운 파일이 업로드될 때 실행됩니다.
const AWS = require('aws-sdk');
const s3 = new AWS.S3();
exports.handler = async (event, context) => {
try {
// S3 이벤트에서 정보 추출
const bucket = event.Records[0].s3.bucket.name;
const key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
// S3 파일 내용 읽기
const data = await s3.getObject({ Bucket: bucket, Key: key }).promise();
// 여기에서 데이터 처리 또는 분석을 수행할 수 있습니다.
return '처리 완료';
} catch (error) {
console.error('에러 발생:', error);
throw error;
}
};
Lambda 함수가 실행될 때, 두 가지 중요한 매개변수를 받습니다: 이벤트와 컨텍스트입니다.
event object
: Data sent during Lambda function invocation
event 파라미터는 Lambda 함수를 호출할 때 입력 이벤트에 대한 정보를 포함하는 매개변수입니다. 이벤트는 JSON 형식으로 제공되며, 호출된 Lambda 함수에 대해 어떤 동작을 수행해야 하는지를 결정하는데 사용됩니다. 예를 들어, AWS API Gateway에서 호출되었을 경우, event에는 클라이언트로부터 받은 요청 데이터가 들어있을 수 있습니다. Lambda 함수의 처리 내용은 이 event 데이터를 기반으로 결정됩니다.
{
"!":"API Gateway Event Data @191121 w/ comics.dev",
"resource": "/hello/{id}",
"path": "/hello/a_123_test",
"httpMethod": "GET",
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"CloudFront-Forwarded-Proto": "https",
"CloudFront-Is-Desktop-Viewer": "true",
"CloudFront-Is-Mobile-Viewer": "false",
"CloudFront-Is-SmartTV-Viewer": "false",
"CloudFront-Is-Tablet-Viewer": "false",
"CloudFront-Viewer-Country": "KR",
"Host": "na12ibnzu4.execute-api.ap-northeast-2.amazonaws.com",
"User-Agent": "HTTPie/1.0.2",
"Via": "1.1 0bfcbc7afd4267da2d9699285b757c04.cloudfront.net (CloudFront)",
"X-Amz-Cf-Id": "cD2syb0t6Am8ifoMdWzF77eG0Mq0kBdJZtmDppVbYOCIAAIkIVbH0Q==",
"X-Amzn-Trace-Id": "Root=1-5dd78f40-51a9a4c0cd7274d057a2d560",
"X-Forwarded-For": "221.149.250.0, 52.46.53.0",
"X-Forwarded-Port": "443",
"X-Forwarded-Proto": "https"
},
"multiValueHeaders": {
"Accept": ["*/*"],
"Accept-Encoding": ["gzip, deflate"],
"CloudFront-Forwarded-Proto": ["https"],
"CloudFront-Is-Desktop-Viewer": ["true"],
"CloudFront-Is-Mobile-Viewer": ["false"],
"CloudFront-Is-SmartTV-Viewer": ["false"],
"CloudFront-Is-Tablet-Viewer": ["false"],
"CloudFront-Viewer-Country": ["KR"],
"Host": ["na12ibnzu4.execute-api.ap-northeast-2.amazonaws.com"],
"User-Agent": ["HTTPie/1.0.2"],
"Via": ["1.1 0bfcbc7afd4267da2d9699285b757c04.cloudfront.net (CloudFront)"],
"X-Amz-Cf-Id": ["cD2syb0t6Am8ifoMdWzF77eG0Mq0kBdJZtmDppVbYOCIAAIkIVbH0Q=="],
"X-Amzn-Trace-Id": ["Root=1-5dd78f40-51a9a4c0cd7274d057a2d560"],
"X-Forwarded-For": ["221.149.250.13, 52.46.53.80"],
"X-Forwarded-Port": ["443"],
"X-Forwarded-Proto": ["https"]
},
"queryStringParameters": {
"ts": "1574150700000"
},
"multiValueQueryStringParameters": {
"ts": ["1574150700000"]
},
"pathParameters": {
"id": "a_123_test"
},
"stageVariables": null,
"requestContext": {
"resourceId": "0e9zzv",
"resourcePath": "/hello/{id}",
"httpMethod": "GET",
"extendedRequestId": "DjNSJEFkIE0FpLw=",
"requestTime": "22/Nov/2019:07:33:20 +0000",
"path": "/dev/hello/a_123_test",
"accountId": "796730245826",
"protocol": "HTTP/1.1",
"stage": "dev",
"domainPrefix": "na12ibnzu4",
"requestTimeEpoch": 1574408000840,
"requestId": "d8485d00-5624-4094-9a93-ce09c351ee5b",
"identity": {
"cognitoIdentityPoolId": null,
"accountId": null,
"cognitoIdentityId": null,
"caller": null,
"sourceIp": "221.149.250.0",
"principalOrgId": null,
"accessKey": null,
"cognitoAuthenticationType": null,
"cognitoAuthenticationProvider": null,
"userArn": null,
"userAgent": "HTTPie/1.0.2",
"user": null
},
"domainName": "na12ibnzu4.execute-api.ap-northeast-2.amazonaws.com",
"apiId": "na12ibnzu4"
},
"body": null,
"isBase64Encoded": false
}
context 파라미터는 Lambda 함수가 실행되는 런타임 환경과 관련된 정보를 포함하는 매개변수입니다. 이 정보에는 Lambda 함수의 실행 시간, 함수의 버전, 로깅 및 모니터링과 관련된 메서드들이 포함되어 있습니다. context를 통해 Lambda 함수는 실행 컨텍스트에 대한 정보에 접근하고, 실행 시에 추가적인 설정이나 조작을 할 수 있습니다.
서버리스 컴퓨팅은 현대적인 클라우드 애플리케이션 개발에서 중요한 역할을 하고 있으며, AWS Lambda와 API Gateway는 서버리스 아키텍처를 구현하는 핵심 서비스 중 하나입니다. AWS Lambda는 서버 없이 코드를 실행하고 API Gateway는 RESTful API를 관리하며, 이 두 서비스를 함께 사용하면 확장 가능하고 효율적인 애플리케이션을 구축할 수 있습니다.
Lambda 함수를 사용하여 서버리스 애플리케이션을 빌드할 때, API Gateway와의 통합을 통해 외부에서 액세스 가능한 RESTful API를 만들 수 있습니다. API Gateway를 사용하면 HTTP 요청을 Lambda 함수로 라우팅하고, Lambda 함수의 응답을 클라이언트로 전달할 수 있습니다.
API Gateway를 설정하려면 API의 엔드포인트, 리소스, HTTP 메서드와 Lambda 함수 간의 매핑 등을 정의해야 합니다. 이를 통해 API Gateway는 클라이언트의 요청을 Lambda 함수로 전달하고 응답을 반환합니다.
AWS Lambda와 API Gateway를 함께 사용하면 확장 가능하고 비용 효율적인 서버리스 애플리케이션을 빠르게 구축하고 배포할 수 있습니다. Lambda 함수의 이벤트 및 컨텍스트와 함께 핸들러 함수를 사용하여 서버리스 애플리케이션을 개발하는 방법을 이해하면 더욱 효과적으로 AWS 환경에서 애플리케이션을 구축할 수 있습니다.
AWS Lambda는 다양한 이벤트 소스로부터 트리거될 수 있는 서버리스 컴퓨팅 서비스입니다. 이 중 SQS (Simple Queue Service), SNS (Simple Notification Service), 그리고 API Gateway가 트리거 역할을 하는 경우에 대해 자세히 설명하겠습니다.
SQS는 분산 메시지 큐 서비스로, 메시지를 큐에 전송하고 이를 Lambda 함수와 통합하여 비동기 이벤트 처리에 사용할 수 있습니다. 다음은 SQS를 트리거로 사용하는 Lambda의 동작 방식입니다.
메시지 전송: Producer가 SQS 큐에 메시지를 전송합니다. 이 메시지는 비동기적으로 처리해야 할 작업을 나타냅니다.
SQS 트리거 설정: Lambda 함수는 특정 SQS 큐를 트리거로 설정합니다. 이 때, SQS 큐에 새로운 메시지가 도착하면 Lambda 함수가 실행되도록 설정됩니다.
Lambda 함수 실행: SQS 큐에 새로운 메시지가 도착하면 Lambda 함수가 자동으로 실행됩니다.
메시지 처리: Lambda 함수는 SQS 큐에서 메시지를 가져와 처리합니다. 예를 들어, 주문 처리 작업을 수행하거나 데이터를 분석하는 등의 작업을 수행할 수 있습니다.
성공 또는 실패 응답: Lambda 함수는 작업을 성공적으로 처리하면 SQS 큐에서 메시지를 삭제하고, 실패한 경우 재시도를 위해 메시지를 다시 큐에 넣을 수 있습니다.
SNS는 이벤트 기반 메시지 송신 서비스로, Lambda 함수를 트리거하기 위한 이벤트 소스로 사용될 수 있습니다. 다음은 SNS를 트리거로 사용하는 Lambda의 동작 방식입니다.
이벤트 발생: 이벤트 소스(예: 데이터 변경, 알림 등)에서 이벤트가 발생합니다.
SNS 토픽 설정: Lambda 함수는 특정 SNS 토픽을 구독(subscribe)하도록 설정합니다. 이 토픽은 이벤트를 전파할 대상을 지정합니다.
Lambda 함수 실행: 이벤트가 발생하면 SNS는 해당 토픽을 구독한 Lambda 함수를 자동으로 실행합니다.
이벤트 처리: Lambda 함수는 이벤트를 처리하고 필요한 작업을 수행합니다. 예를 들어, 이벤트에 따라 특정 동작을 수행하거나 알림을 생성할 수 있습니다.
성공 또는 실패 응답: Lambda 함수는 작업을 성공적으로 처리하면 SNS로 성공 응답을 전송할 수 있습니다. 실패한 경우 재시도 또는 오류 처리를 수행할 수 있습니다.
API Gateway는 HTTP 엔드포인트를 제공하며, Lambda 함수를 호출하고 애플리케이션의 API를 노출하는 데 사용됩니다. 다음은 API Gateway를 트리거로 사용하는 Lambda의 동작 방식입니다.
API Gateway 설정: API Gateway를 사용하여 HTTP 엔드포인트를 설정하고 리소스와 메서드를 정의합니다. 이를 통해 클라이언트가 Lambda 함수를 호출할 수 있는 RESTful API를 생성합니다.
API 호출: 클라이언트가 API Gateway 엔드포인트에 HTTP 요청을 보냅니다.
API Gateway 트리거: API Gateway는 요청을 받아와서 해당 리소스와 메서드에 매핑된 Lambda 함수를 트리거로 실행합니다.
Lambda 함수 실행: Lambda 함수가 실행되면 요청 데이터를 처리하고 필요한 작업을 수행합니다. 이 작업에는 데이터베이스 쿼리, 인증, 로깅 등이 포함될 수 있습니다.
응답 생성: Lambda 함수는 API Gateway로 응답을 반환하고, API Gateway는 클라이언트에게 해당 응답을 전달합니다.
위의 방식을 통해 API Gateway와 Lambda 함수를 결합하면 클라이언트가 HTTP 요청을 보내면 서버리스 애플리케이션의 코드가 실행되어 필요한 작업을 수행하고 클라이언트에게 응답을 반환합니다. 이를 통해 서버리스 아키텍처에서도 원활한 API 서비스를 제공할 수 있습니다.
AWS Lambda 함수의 output은 함수가 실행된 후 생성되는 결과 데이터나 출력물을 가리킵니다. Lambda 함수는 이 output을 다양한 방법으로 활용할 수 있으며, 특히 이를 SNS (Simple Notification Service), S3 (Simple Storage Service), SQS (Simple Queue Service)와 연결하여 유용하게 활용할 수 있습니다.
Lambda 함수의 output은 주로 다음과 같은 형태를 가집니다:
함수 응답 (Function Response): Lambda 함수는 작업을 수행한 후 클라이언트에게 반환할 응답을 생성합니다. 이 응답은 주로 HTTP 상태 코드, 헤더 및 본문을 포함합니다. 이것은 API Gateway와의 통합에 매우 일반적입니다.
로그 및 로그 스트림: Lambda 함수는 실행 중에 로깅을 수행하고 로그 데이터를 CloudWatch Logs로 스트림합니다. 이를 통해 함수의 동작을 모니터링하고 디버깅할 수 있습니다.
직접 출력: Lambda 함수는 작업 결과를 직접 출력할 수 있으며, 이 출력은 클라이언트나 다른 AWS 서비스로 전송할 수 있습니다.
Lambda 함수의 output을 SNS, S3, SQS와 연결하는 것은 다양한 시나리오에서 유용합니다. 아래에서 각각의 연결 방법에 대해 설명하겠습니다.
1. Lambda 함수의 Output을 SNS와 연결
Lambda 함수의 output을 SNS 토픽으로 전송할 수 있습니다. 이를 통해 다음과 같은 작업을 수행할 수 있습니다:
알림 (Notification): Lambda 함수의 실행 결과를 관련된 이메일, SMS, HTTP 엔드포인트로 알림을 보낼 수 있습니다.
이벤트 기반 아키텍처 (Event-Driven Architecture): Lambda 함수의 output을 SNS를 사용하여 이벤트 기반 아키텍처에서 다른 서비스로 전달할 수 있습니다.
2. Lambda 함수의 Output을 S3와 연결
Lambda 함수의 output을 S3 버킷으로 저장할 수 있습니다. 이를 통해 다음과 같은 작업을 수행할 수 있습니다:
파일 저장: Lambda 함수의 결과를 파일로 저장하고 나중에 필요한 경우 다운로드할 수 있습니다.
데이터 백업: Lambda 함수의 output을 S3에 저장하여 데이터의 백업을 수행하고, 장애 복구에 사용할 수 있습니다.
비동기 작업 결과 저장: Lambda 함수가 비동기 작업을 수행하는 경우 결과 데이터를 S3에 저장하여 추후 검색 및 분석에 활용할 수 있습니다.
3. Lambda 함수의 Output을 SQS와 연결
Lambda 함수의 output을 SQS 큐로 전송할 수 있습니다. 이를 통해 다음과 같은 작업을 수행할 수 있습니다:
비동기 작업 큐 (Asynchronous Job Queue): Lambda 함수의 결과를 SQS 큐에 전송하여 비동기 작업을 큐잉하고 나중에 처리할 수 있습니다.
이벤트 및 메시지 전달: Lambda 함수의 output을 다른 서비스에 이벤트 및 메시지로 전달하고 처리할 수 있습니다.
이렇게 Lambda 함수의 output을 SNS, S3, SQS와 연결함으로써, 결과 데이터를 저장하고 공유하며, 다른 서비스와 통합하여 활용할 수 있습니다. 이는 서버리스 아키텍처에서 유용하게 활용되며, 데이터 관리와 이벤트 처리를 효율적으로 수행하는 데 도움이 됩니다.
정보 감사합니다.