s3에 파일을 안전하게 보관하기

YEONGHUN KO·2025년 1월 31일
1

AWS

목록 보기
4/4
post-thumbnail

크게 3가지 방법이 있다.

퍼블릭엑세스차단 해제

: 기본적으로 s3는 퍼블릭에서 접근하는 요청을 차단한다. put / get 다 그렇다.

근데 엑세스 차단 해제를 하면 누구나 CRUD가 가능해지기 때문에 어느순간 일어났을때 통장에 감당하지 못할 금액이 찍힐 수 있기에 되도록이면 해제를 하지 말자.

ec2 role + s3정책

: ec2에 역할을 부여하고 그 역할만 s3에 접근가능하도록 정책을 명시해주면 된다.

먼저 iam에서 s3fullaccess할 수 있는 built-in정책을 선택하거나 아니면 s3의 좀 더 제한된 기능을 원한다면 custom 정책을 만들 수 있다.

iam 정책만들기

  1. 'iam - 정책'을 선택하여 정책을 생성한다.
  2. s3를 선택하고 get/put등등 허용가능한 권한을 추가해주고 정책이름을 정해주면 된다.

iam 역할 만들기

  1. 'iam - 역할'을 선택하여 역할을 생성한다.
  2. aws service를 선택하여 ec2에 적용할 역할이라고 지정해주고 위에서 만든 정책을 연결하여 역할을 만든다.

역할 ec2에 연결하기

  1. 역할을 지정해줄 ec2인스턴스를 클릭한다.
  2. 보안 - iam 역할 수정을 클릭하고 위에서 만든 역할을 지정해준다.

역할이 부여된 ec2만 접근가능하도록 s3정책 수정

  1. s3 - 권한 탭 - 정책 - 수정을 클릭하여 아래 정책을 입력해준다.
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::your-ec2-role"
            },
            "Action": [
                "s3:PutObject",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::your-s3-name",
                "arn:aws:s3:::your-s3-name/*"
            ]
        }
    ]
}

ec2 arn은 ec2 인스턴스 정보란에 있으니 잘 살펴보아라.

s3 정책설정이 끝나고 해당 ec2에서 파일을 업로드할 수 있는지 cli로 간단하게 테스트 가능하다.

aws s3 cp {업로드할 object 경로} s3://{업로드할 S3 버킷의 폴더}
aws s3 cp ./test.jpeg s3://your-s3-name/

그리고 클라이언트에서 파일을 받아올 수 있도록 s3 cors설정을 아래처럼 해주자.

[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "GET",
        ],
        "AllowedOrigins": [
            "https://domain",
            "http://localhost:3000"
        ],
        "ExposeHeaders": [
            "ETag"
        ]
    }
]

그럼 ec2에서 업로드하고 브라우저에서 s3에 업로드된 파일을 받아 볼 수 있게 된다.

여기서 끝난게 아니다. 브라우저에서 사용하려면 s3-sdk를 사용해야하는데 이때 키가 필요하다.

s3 키 발급

  1. iam-사용자-사용자생성-amazons3fullacess를 클릭하여 s3에 관한 사용자를 생성한다.
  2. 사용자를 클릭하고 '보안자격증명' 탭에 들어가 엑세스 키를 만들면 된다.
  3. csv형태로 access/secret 키를 발급받을 수 있으며 한 번 다운받으면 다시 다운 받을 수 없으니 유의 바란다.

s3 sdk 이용 방법은 아래 출처 링크를 확인바람

pre-signedUrl 활용

:가장 간단한 방법이다. s3에 임시적으로 파일을 조작할 수 있는 url을 가져오는 방법이다. 파일 용량이 크지 않는 이상, url 유효기간을 60초로 해놓으면 적당할 듯하다.

서버를 신경쓰지 않고 바로 브라우저에서 get/put할 수 있기에 유지보수도 간단하다.

get 하는 방법

 const getObjectParams = {
        Bucket: process.env.NEXT_PUBLIC_S3_BUCKET_NAME,
        Key: "파일또는 폴더 이름",
      };
      const command = new GetObjectCommand(getObjectParams);
      const url = await getSignedUrl(client, command, { expiresIn: 60 });

url을 이미지 src에 넣어주면 끝!

put 하는 법(업로드)

  const uploadImage = async (file: File) => {
    const uploadParams: PutObjectCommandInput = {
      Bucket: process.env.NEXT_PUBLIC_S3_BUCKET_NAME,
      Key: `${file.name}`,
      Body: Buffer.from(await file.arrayBuffer()),
      ContentType: file.type,
    };

    try {
      const putCommand = new PutObjectCommand(uploadParams);

      const signedUrl = await getSignedUrl(client, putCommand, {
        expiresIn: 60,
      });

      await fetch(signedUrl, {
        method: "PUT",
        body: file,
        headers: {
          "Content-Type": file.type,
        },
      });

      alert("File uploaded successfully!");
    } catch (error) {
      console.error("Error uploading file:", error);
      alert("Failed to upload the file. Please try again.");
    }
  };

pre-signedUrl을 이용해서 'PUT' method를 이용하여 업로드할 수 있다.

vpc?

:vpc를 이용해서 보안을 더 강화하려고 했으나 기본적으로 s3를 생성하면서 기본vpc가 적용되어있기때문이기도 하고 pre-signedUrl만으로도 충분히 보안을 강화한다 생각하여 따로 vpc를 만들지는 않았다.

출처

  1. iam role

  2. s3 key 발급

  3. s3 sdk 이용 및 설정방법

  4. pre-signedUrl

profile
'과연 이게 최선일까?' 끊임없이 생각하기

0개의 댓글