이전 실습 (썸네일로 변환하기) 의 연장선입니다.
만들었던 이전 실습(썸네일로 변환하기) 에 다음의 기능을 추가합니다.
s3 의 변경사항을 람다가 바로 받지 말고 SQS 받도록 변경
썸네일용 이미지의 링크를 이메일에 전달
대기열 생성
버튼 클릭원본 버킷
이 SQS
에게 메세지를 줄 수 있도록 정책 변경하기{
"Version": "2012-10-17",
"Id": "example-ID",
"Statement": [
{
"Sid": "example-statement-ID",
"Effect": "Allow",
"Principal": {"Service": "s3.amazonaws.com"},
"Action": "SQS:SendMessage",
"Resource": "arn:aws:sqs:ap-northeast-2:640668917513:test-que",
"Condition": {
"ArnLike": {
"aws:SourceArn": "arn:aws:s3:::bk-pictrue"
}
}
}
]
}
Resource
에는 방금 만든 SQS 의 arn 정보를 넣고, aws:SourceArn
에는 원본 버킷
의 arn 을 넣는다. 저장
버튼 클릭속성 탭
이동이벤트 알림 생성
버튼 클릭 편집
클릭 정책
을 복사하여 넣는다.{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:PutLogEvents",
"logs:CreateLogGroup",
"logs:CreateLogStream"
],
"Resource": "arn:aws:logs:*:*:*"
},
{
"Sid": "AllAccess",
"Action": "s3:*",
"Effect": "Allow",
"Resource": [
"*"
]
},
{
"Sid": "SQSAllAccess",
"Effect": "Allow",
"Action": [
"sqs:*"
],
"Resource": "*"
}
]
}
트리거 추가
버튼 클릭 주제 생성
버튼 클릭주제 엑세스 정책
변경편집
으로 이동 액세스 정책
편집기 이동arn:aws:sns:ap-northeast-2:640668917513:test-1
는 자신의 SNS arn
으로 바꿔준다.{
"Version": "2008-10-17",
"Id": "__default_policy_ID",
"Statement": [
{
"Sid": "__default_statement_ID",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": [
"SNS:GetTopicAttributes",
"SNS:SetTopicAttributes",
"SNS:AddPermission",
"SNS:RemovePermission",
"SNS:DeleteTopic",
"SNS:Subscribe",
"SNS:ListSubscriptionsByTopic",
"SNS:Publish"
],
"Resource": "arn:aws:sns:ap-northeast-2:640668917513:test-1",
"Condition": {
"StringEquals": {
"AWS:SourceOwner": "640668917513"
}
}
},
{
"Sid": "Allow-AWS-Service-to-publish-to-the-topic",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "SNS:Publish",
"Resource": "arn:aws:sns:ap-northeast-2:640668917513:test-1"
}
]
}
이메일 구독
설정구독 생성
버튼 클릭 Confirm subscription
클릭 소스 코드 수정 후 재배포
app.js
에 넣는다.const aws = require('aws-sdk');
const s3 = new aws.S3({ apiVersion: '2006-03-01' });
const sharp = require('sharp');
exports.lambdaHandler = async (event, context) => {
try {
event.Records[0].body = JSON.parse(event.Records[0].body);
console.log("event: ", JSON.stringify(event));
console.log("context: ", JSON.stringify(context));
console.log("event.Records[0].body: ", event.Records[0].body);
const s3Data = event.Records[0].body.Records[0].s3;
const {awsRegion} = event.Records[0].body.Records[0];
const bucket = s3Data.bucket.name; // 원본 버킷 이름
const key = s3Data.object.key; // 원본 버킷 키
console.log("bucket: ", bucket);
console.log("key: ", key);
const dstBucket = process.env.s3resized // 썸네일 버킷 이름
// 원본 버킷으로부터 파일 읽기
const s3Object = await s3.getObject({
Bucket: bucket,
Key: key
}).promise()
console.log(`dstBucket: `, dstBucket);
// 이미지 리사이즈, sharp 라이브러리가 필요합니다.
const data = await sharp(s3Object.Body)
.resize(200)
.jpeg({ mozjpeg: true })
.toBuffer()
// 대상 버킷으로 파일 쓰기
const result = await s3.putObject({
Bucket: dstBucket,
Key: key, // 원본 버킷 키와 동일
ContentType: 'image/jpeg', // 컨텐츠 타입
Body: data,
ACL: 'public-read'
}).promise()
snsArn = process.env.arnTopic
const sns = new aws.SNS(awsRegion);
const massage = await sns.publish({
Message : "URL : "+`https://${process.env.s3resized}.s3.${awsRegion}.amazonaws.com/${key}`,
Subject: "썸네일 도착",
TopicArn : process.env.arnTopic
}).promise()
console.log(`massage :`, massage);
return result;
} catch (e) {
console.log("ERROR: ", e);
return "ERROR"
}
}
sam build; sam deploy;
람다 함수
의 환경변수 편집
에 들어가서 SNS 환경 변수
설정
arnTopic
: arn:aws:sns:ap-northeast-2:640668917513:test-1
추후 해볼 내용
S3의 Pre-signed URL 기능을 이용하여, 업로드 전용 URL을 획득하고, 이를 통해 이미지를 S3 업로드할 수 있게 만들어봅시다
참고자료:
3. 연습: 알림용 버킷 구성(SNS 주제 또는 SQS 대기열)
5. json strip
6. json viewer
7. How to Send an Email Notification Using AWS Lambda
8. 서버리스랜드
10. 깃허브