1, 개요
S3 Bucket에 새로운 파일이 올라오는 것을 Lambda 함수를 통해 모니터링하는 작업이다.
2. S3 Bucket 생성
당연히 S3 Bucket이 있어야 한다. 본 문서에서는 생략한다.
3. Lambda 함수 생성
3-1. 새로 작성 화면
- 이름 : 함수 이름 (본인은 lambda-s3-trigger)
- 런타임 : Node.js
- 역할 : 선택 (사용자 지정 역할 생성을 선택하면 새 창이 열림)
- 함수 생성하면 다음 페이지로 넘어감
3-2. 다음 화면
- 왼쪽에서 트리거 추가에 S3 선택
- 우측에는 Amazon CloudWatch Logs가 놓여져 있다.
- 버킷 선택
- 이벤트 유형 : 객체 생성됨(모두)
- 트리거 활성화에 체크되어 있는지 확인
- [추가] 클릭
3-3. 코드 생성
- 위에 Lamda 함수 클릭 (본인은 lambda-s3-trigger 박스 클릭)
- 코드 인라인 편집에 다음 내용 삽입 후 [저장]
exports.handler = (event, context, callback) => {
var lastCreatedFile = event.Records[0].s3.object.key;
console.log(lastCreatedFile);
};
4. 업로드 테스트
대상 Bucket의 temp 디렉토리에 다음 세 파일을 차례로 올려봄
- sar_1.txt
- sar_2.txt
- sar_3.txt
5. CloudWatch 확인
- CloudWatch > 로그 그룹에서 /aws/lambda/lambda-s3-trigger 선택
- 로그 스트림
A 00:50:06 START RequestId: 5f5f402d-f1b2-11e7-a6ee-956081cd3f56 Version: $LATEST A 00:50:06 2018-01-05T00:50:06.929Z 5f5f402d-f1b2-11e7-a6ee-956081cd3f56 temp/sar_1.txt A 00:50:06 END RequestId: 5f5f402d-f1b2-11e7-a6ee-956081cd3f56 A 00:50:06 REPORT RequestId: 5f5f402d-f1b2-11e7-a6ee-956081cd3f56 Duration: 12.27 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 19 MB A 00:50:18 START RequestId: 666dbd1c-f1b2-11e7-947e-03ff07d67945 Version: $LATEST A 00:50:18 2018-01-05T00:50:18.364Z 666dbd1c-f1b2-11e7-947e-03ff07d67945 temp/sar_2.txt A 00:50:18 END RequestId: 666dbd1c-f1b2-11e7-947e-03ff07d67945 A 00:50:18 REPORT RequestId: 666dbd1c-f1b2-11e7-947e-03ff07d67945 Duration: 0.47 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 19 MB A 00:51:27 START RequestId: 8fe9b4b5-f1b2-11e7-9007-37fd113dc65a Version: $LATEST A 00:51:27 2018-01-05T00:51:27.998Z 8fe9b4b5-f1b2-11e7-9007-37fd113dc65a temp/sar_3.txt A 00:51:28 END RequestId: 8fe9b4b5-f1b2-11e7-9007-37fd113dc65a A 00:51:28 REPORT RequestId: 8fe9b4b5-f1b2-11e7-9007-37fd113dc65a Duration: 6.75 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 19 MB
6. 이메일 발송
6-1. SES 설정
본 문서에서는 생략함
6-2. Lambda 코드
var aws = require('aws-sdk');
var ses = new aws.SES({
region: 'us-east-1'
});
const s3 = new aws.S3({
apiVersion: '2006-03-01'
});
exports.handler = function(event, context, callback) {
console.log("Incoming: ", event);
const bucket = event.Records[0].s3.bucket.name;
const key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
const news = `Event took place in - ${bucket} -> ${key}`;
const params = {
Bucket: bucket,
Key: key,
};
var eParams = {
Destination: {
ToAddresses: ["xxxxx@gmail.com"]
},
Message: {
Body: {
Text: {
Data: `${news}`
}
},
Subject: {
Data: "Email Notification"
}
},
Source: "xxxxx@gmail.com"
};
console.log('===SENDING EMAIL===');
var email = ses.sendEmail(eParams, function(err, data) {
if (err) console.log(err);
else {
console.log("===EMAIL SENT===");
// console.log(data);
console.log("EMAIL CODE END");
console.log('EMAIL: ', email);
context.succeed(event);
}
});
};
6-3. 메일 발송 권한
Policy 생성 후 attach
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ses:SendEmail",
"ses:SendRawEmail"
],
"Resource": "*"
}
]
}
6-4. 문제 발생
위와 같이 하였으나 다음과 같은 문제가 발생하였다.
018-01-05T09:39:34.580Z ..... { AccessDenied: User `arn:aws:sts::.....:assumed-role/role-s3-trigger/lambda-s3-trigger' is not authorized to perform `ses:SendEmail' on resource `arn:aws:ses:us-east-1:.....:identity/xxxxx@gmail.com'
at Request.extractError (/var/runtime/node_modules/aws-sdk/lib/protocol/query.js:47:29)
at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:105:20)
at Request.emit (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:77:10)
at Request.emit (/var/runtime/node_modules/aws-sdk/lib/request.js:683:14)
at Request.transition (/var/runtime/node_modules/aws-sdk/lib/request.js:22:10)
at AcceptorStateMachine.runTo (/var/runtime/node_modules/aws-sdk/lib/state_machine.js:14:12)
at /var/runtime/node_modules/aws-sdk/lib/state_machine.js:26:10
at Request. (/var/runtime/node_modules/aws-sdk/lib/request.js:38:9)
at Request. (/var/runtime/node_modules/aws-sdk/lib/request.js:685:12)
at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:115:18)
message: 'User `arn:aws:sts::.....:assumed-role/role-s3-trigger/lambda-s3-trigger\' is not authorized to perform `ses:SendEmail\' on resource `arn:aws:ses:us-east-1:.....:identity/xxxxx@gmail.com\'',
code: 'AccessDenied',
time: 2018-01-05T09:39:34.580Z,
requestId: '.....',
statusCode: 403,
retryable: false,
retryDelay: 2.80149057710668 }
6-5. 원인
node.js 코드 상에 apiVersion을 2012-10-17 으로 수정한다. 일부러 위에 수정하지 않음.