[aws]s3 이미지 업로드

코드왕·2023년 10월 10일

PRESIGNED URL 방식.. 권한부터 설정하자

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "1",
			"Effect": "Allow",
			"Principal": "*",
			"Action": "s3:GetObject",
			"Resource": "arn:aws:s3:::freepeopleimage/*"
		},
		{
			"Sid": "2",
			"Effect": "Allow",
			"Principal": {
				"AWS": "arn:aws:iam::368805166953:root"
			},
			"Action": [
				"s3:PutObject",
				"s3:DeleteObject"
			],
			"Resource": "arn:aws:s3:::freepeopleimage/*"
		}
	]
}

freepeopleimage이라고 써진 부분은 내 버킷 이름으로 바꿔줘야됨

CORS 설정하자

[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "PUT",
            "POST"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": [
            "ETag"
        ]
    }
]

IAM으로 이동해서 사용자를 기존 정책으로 만들어주자

액세스 키 발급하자

인풋태그 만들자

                      <input
                        type="file"
                        accept="image/*"
                        onChange={async (e) => {
                          let file = e.target.files[0];
                          let filename = encodeURIComponent(file.name);
                          let res = await fetch(
                            "/api/post/image?file=" + filename
                          );
                          res = await res.json();

                          //S3 업로드
                          const formData = new FormData();
                          Object.entries({ ...res.fields, file }).forEach(
                            ([key, value]) => {
                              formData.append(key, value);
                            }
                          );
                          let 업로드결과 = await fetch(res.url, {
                            method: "POST",
                            body: formData,
                          });
                          console.log(업로드결과);

                          if (업로드결과.ok) {
                            setSrc(업로드결과.url + "/" + filename);
                          } else {
                            console.log("실패");
                          }
                        }}
                      />

api 하나 만들어 주자

import aws from 'aws-sdk'
export default async function handler(요청, 응답){
    aws.config.update({
      accessKeyId: process.env.ACCESS_KEY,
      secretAccessKey: process.env.SECRET_KEY,
      region: 'ap-northeast-2',
      signatureVersion: 'v4',
    })

    const s3 = new aws.S3();
    const url = await s3.createPresignedPost({
      Bucket: process.env.BUCKET_NAME,
      Fields: { key : 요청.query.file },
      Expires: 60, // seconds
      Conditions: [
        ['content-length-range', 0, 104857600], //파일용량 1MB 까지 제한
      ],
    })

    응답.status(200).json(url)
}  
profile
CODE DIVE!

0개의 댓글