SAM 은 AWS의 서버리스 쪽 선언적 IaC 이다. 이러한 SAM을 통해서, 원하는 인프라를 구성할 수 있기에 S3 업로드용 presigned url
을 만드는 람다함수를 만들어보고 실제로 정상적으로 동작하는 지 테스트해보자.
presigned url
을 얻고 presigned url
을 통해 S3 에 업로드초기 선수 조건:
Repo
를 받고 lambda-test/getPreUrl
로 이동한다.$ git clone https://github.com/SangYunLeee/lambda-test.git
$ cd lambda-test/getPreUrl
lambda-test/getPreUrl
에 있는 template.yaml
을 통해 인프라 구성을 확인할 수 있다.# template.yaml
AWSTemplateFormatVersion: 2010-09-09
Description: >-
sam-app
Transform:
- AWS::Serverless-2016-10-31
Resources:
S3Bucket:
# S3 버킷 생성
Type: 'AWS::S3::Bucket'
getPreUrlLambdaFunction:
# 람다 함수 생성
Type: AWS::Serverless::Function
Properties:
# 함수 소스코드 경로 및 함수명
Handler: src/handlers/get-preurl-lambda.getPreUrllambdaHandler
Runtime: nodejs14.x
Architectures:
- x86_64
MemorySize: 128
Timeout: 100
Description: get-s3-preurl-for-upload
# 람다 함수에 적용될 정책
Policies:
- AWSLambdaBasicExecutionRole # 함수 실행 권한
- AmazonS3FullAccess # S3 PUT, GET 권한
Environment:
Variables:
BucketName: !Ref S3Bucket # 람다함수의 환경변수에 넣어질 S3 버킷명
# API Gateway 명
Events:
HelloWorld:
Type: Api
Properties:
Path: /s3
Method: get
pre-url
을 전달한다.const AWS = require('aws-sdk');
const s3 = new AWS.S3();
exports.getPreUrllambdaHandler = async (event) => {
let presignedGETURL = s3.getSignedUrl('putObject', { // putObject => 파일을 추가하겠다는 의미
Bucket: process.env.BucketName, // 환경변수에 저장된 버킷명
Key: 'test.jpeg', // 생성할 파일명
Expires: 3600 // 3600초후 만료
});
console.log(`presignedGETURL :`, presignedGETURL);
// 클라이언트에게 pre-URL 반환
const response = {
statusCode: 200,
body: presignedGETURL
};
return response;
}
빌드를 하고 배포를 진행한다.
$ sam build
$ sam deploy
y
엔드포인트
클릭하여 브라우저로 접속 pre-url
복사 POSTMAN
을 통해 파일 PUT
요청 파일 업로드가 되면 정상적으로 완료..!!!
실습이 끝났으니 삭제를 해주자.
sam delete
실행 참고자료 :