체인의정석

S3를 써서 NFT 메타데이터 업로드 하기 본문

개발/backend(js,ts)

S3를 써서 NFT 메타데이터 업로드 하기

체인의정석 2025. 11. 21. 17:29
728x90

프로그램에서 S3에 접근하기 위해서는 AWS credentials가 먼저 필요하다.

aws credentials 확인의 경우 다음과 같은 경로에 세팅 한다.

cat ~/.aws/credentials
[default]
aws_access_key_id = 
aws_secret_access_key =

ts에서 사용하는 패키지

import S3Helper from '@lib/AWS/S3Helper';

먼저 프로필을 사용해서 객체를 만들어 줘야 한다.

const testS3Helper = new S3Helper('us-west-2', 'default');

그리고 정책에 들어가서 해당 IAM계정이 S3에 어떠한 권한이 있는지 체크해야 한다.

보아하니 권한 끝에 /*가 붙어 있지 않으면 s3Object를 다룰 수 없다고 하여 붙여 주었다.

          await Promise.all([
            ...tokenIds.map((tokenId) =>
              s3Helper.s3
                .copyObject({
                  Bucket: PUBLIC_S3_BUCKETNAME,
                  CopySource: `/${PRIVATE_S3_BUCKETNAME}/nft1/${tokenId}.png`,
                  Key: `testNFT/${tokenId}.png`,
                })
                .promise(),
            ),
          ]);

만약 이런식으로 해두면 private에 미리 올려둔 S3에 접근해서 파일을 옮긴다면 

만약 CopySource인 S3에 해당 데이터가 없다면 "Copy failed The specified key does not exist."

이렇게 뜨게 된다.

이제 이벤트를 구독하면서 nft민팅이 확인된 순간 프라이빗 S3에서 퍼블릭 S3로 옮기게 되면 NFT 민팅이 완성된다.

이렇게 하는 이유는 위의 명령어는 S3 내부적으로 파일이 이동하는 것임으로 시간이 얼마 걸리지 않으며, nft가 민팅이 확정된 시점에 프라이빗 S3에서 퍼블릭 S3로 옮기면 짧은 시간 내에 nft민팅을 완료활 수 있기 때문이다.

만약 복사해서 옯기는 행위가 아니라 S3에 접근해서 데이터를 수정하고 업로드를 해야하는 경우 다음과 같이 할 수 있다.

    // 메타데이터 JSON 파일 가져와서 수정 후 업로드
    try {
      // 1. projectName 이라는 경로에 있는 S3에서 원본 JSON 파일 가져오기
      const metadataResponse = await s3Helper.s3
        .getObject({
          Bucket: PRIVATE_S3_BUCKETNAME,
          Key: `projectName/metadata/${exampleID}.json`,
        })
        .promise();

      // 2. JSON 파싱
      const metadata = JSON.parse(metadataResponse.Body.toString());

      // 3. 필요한 필드 수정
      metadata.name = `NFT #${tokenId}`;
      metadata.image = `https://${CDN_DOMAIN}/${projectName}/${nftContractAddress}/image/${tokenId}.png`;
      console.log('metadata: ', metadata);
      // 4. 수정된 JSON 업로드
      await s3Helper.upload({
        bucketName: PUBLIC_S3_BUCKETNAME,
        key: `${CONTRACT_DATA_S3_PATH}/${nftContractAddress}/metadata/${tokenId}.json`,
        body: JSON.stringify(metadata),
        contentType: 'application/json',
      });
    } catch (error) {
      console.log(`Failed to modify and upload metadata for tokenId: ${tokenId}, error);
      return;
    }

이처럼 S3에 접근해서 이벤트 또는 db기반의 데이터를 읽어와서 메타데이터를 수정하는것이 가능하며,

위와 같은 형식은 메타데이터가 민팅 전에는 비공개로 있다가 공개가 되는 순간 특정 유저에게 특정 상황에 맞는 nft가 민팅되어야 할 때 사용할 수 있다.

 

728x90
반응형
Comments