-
[aws] image resize(2): s3 batch & lambdaaws 2021. 5. 16. 22:09
[S3 Batch Operations]
Flow of S3 Batch Operations 하욤! 앞에서 상황을 설명했으니 이젠 구현을 기술하기 전 S3 Batch Operations 기능은 다음과 같다. 이 기능을 이용하면 수백, 수백만 또는 수십억 개의 S3 객체를 간단하고 간편한 방식으로 처리할 수 있다. 다른 버킷에 객체를 복사하거나, 태그 또는 ACL을 설정하거나, Glacier에서 복원을 시작하거나, 각 객체별로 Lambda 함수를 호출할 수 있다. 이 기능은 S3에서 지원되는 Inventory Report를 기반으로 하며, 보고서 또는 CSV 파일을 통해 배치 작업을 지원할 수 있다. 작업을 생성하고 실행하면 S3가 대규모 병렬 프로세스를 통해 자동으로 작업을 처리한다. 사용하는 S3 콘솔, S3 CLI 또는 S3 API를 사용하여 배치 작업을 생성하고 모니터링하고 관리할 수 있다.
[Make S3 Inventory]
앞서 기술한 S3 Batch Operations 기능은 S3 Inventory Report 기반으로 한다. S3 Inventory란 S3에서 스토리지 관리를 지원하기 위해 제공하는 도구 중 하나로, 이 인벤토리를 사용하여 비즈니스, 규정 준수 및 규제 요건에 대한 객체의 복제 및 암호화 상태를 감사하고 보고할 수 있다. S3 Inventory의 결과로써 보고서를 생성한다. 앞서 말했듯이 S3 Batch Operations는 S3 Inventory의 결과를 바탕으로 하기에 난 이 보고서를 먼저 생성해야만 했다. 생성하는 방법은 기술하지 블로그의 취지와 다르게 깊은 내용이 아니라서 생략하겠다.
Amazon S3 인벤토리 구성 - Amazon Simple Storage Service
이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.
docs.aws.amazon.com
[Make Lambda]
S3 Inventory를 통해 배치의 대상을 정했다면 배치의 목적 또한 정해야만 하고 난 프로젝트의 의도에 맞게 Lambda를 선택했다. Lambda란 이벤트에 대한 응답으로 코드를 실행하고 자동으로 기본 컴퓨팅 리소스를 관리하는 서버리스 컴퓨팅 서비스이다. 하여간 이 친구에게 생명을 불어넣어주는 방법은 여러 가지로 다양하다. 많고 많은 방법 중에 Node.js를 선택했고 그 이유는 다음과 같았다. Imagemagick를 대신할 프로그램을 못 찾았고 Imagemagick를 컨트롤하는 gm이란 패키지가 구미가 당겼기에 택했다. 여기서 개발자라면 한 가지를 의문점을 품어야만 한다.
Lambda는 서버리스 프로그램인데 어떻게 Imagemagick을 실행할 수 있을까?
위의 의문점을 품었다면 당신은 개발자다. 라이브러리, 종속성 또는 사용자 지정 런타임과 같은 추가 코드가 포함된 아카이브인 Lambda Layer를 사용해서 이를 해결할 수 있다. 다행히도 누군가 미리 만들어둔 image-magick-lambda-layer가 있기에 난 이것을 추가했다. 끝내 완성된 코드는 다음과 같다.
serverlesspub/imagemagick-aws-lambda-2
ImageMagick for AWS Lambda 2 runtimes. Contribute to serverlesspub/imagemagick-aws-lambda-2 development by creating an account on GitHub.
github.com
const AWS = require("aws-sdk"); const gm = require("gm").subClass({imageMagick: true}); const s3 = new AWS.S3(); function gmToBuffer(data) { return new Promise((resolve, reject) => { data.stream((err, stdout, stderr) => { if (err) return reject(err) const chunks = [] stdout.on('data', (chunk) => { chunks.push(chunk) }) stdout.once('end', () => { resolve(Buffer.concat(chunks)) }) stderr.once('data', (data) => { reject(String(data)) }) }); }); } exports.handler = async (event) => { const results = await Promise.all(event.tasks.map(async (it) => { const original = await s3.getObject({ Bucket: '', Key: it.s3Key, }).promise(); const result = await gmToBuffer( gm(original.Body, it.s3Key) .gravity("NorthWest") .extent("930") ); const s3Result = await s3.putObject({ Bucket: '', Key: it.s3Key, Body: result, }).promise(); return ({ taskId: it.taskId, resultCode: "Succeeded", resultString: `${it.s3Key} success`, }); })); return { invocationSchemaVersion: event.invocationSchemaVersion, treatMissingKeysAs: "PermanentFailure", invocationId: event.invocationId, results, }; };
[마치며]
AWS Batch Operations 대상은 S3 Invetory Report로서 목적은 Lambda로서 구현했으니 S3 Batch Opertaions을 구성할 수 있다. 구성하고 실행하면 생성된 성공, 실패의 보고서를 확인할 수 있다. 나의 배치는 99% 성공률을 보여줬고 실패한 케이스는 애초에 파일 자체의 오류가 있었던 것으로 보여 이쯤에서 글을 마무리하려 한다. 결론은 수많은 객체를 컨트롤해야만 하는 상황에선 S3 Batch Opertaions이 답이다. 빠욤!
Amazon S3 배치 작업 - AWS
S3 배치 작업에서 작업을 수행하려면 작업을 생성합니다. 작업은 객체 목록, 수행할 작업 및 해당 유형의 작업에 대해 지정한 파라미터 집합으로 구성됩니다. S3 배치 작업에서 한 번에 여러 작업
aws.amazon.com
'aws' 카테고리의 다른 글
[aws] health check(gray): elastic beanstalk (0) 2021.05.25 [aws] image backup(2): lambda & s3 & nas (0) 2021.05.19 [aws] image backup(1): lambda & s3 & nas (0) 2021.05.18 [aws] image resize(1): s3 batch & lambda (1) 2021.05.16 [aws] what is aws? (0) 2021.05.14