
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 실행 
참고자료 :