S3 credential object is not valid 오류 해결

silver·2025년 3월 5일

AWS

목록 보기
2/3
post-thumbnail

배경

팀프로젝트를 진행하면서 S3에서 파일 업로드를 위한 presigned URL을 발급하는 API를 추가했다. 이 API는 기존에 내 개인 프로젝트에서 사용했던 코드를 가져왔는데 동일한 코드인데도 개인 프로젝트에선 발생하지 않던 문제가 발생했다.

Resolved credential object is not valid

S3 client를 생성할 때 만든 credentials 객체가 올바르지 않다는 메시지였다.

this.s3Client = new S3Client({
      region: process.env.AWS_REGION,
      credentials: {
        accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
        secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
      },
    });

s3Client를 생성할 때 이렇게 AWS계정과 관련된 정보가 필요한데 IAM 유저를 만들어서 s3에 대한 권한을 허용하고 accessKey를 다운받아서 .env 파일에 추가해놓은 상태였다.
하지만 위와 같은 에러가 계속 발생했다.

해결시도

1.S3,cloudfront,IAM 유저 설정 문제?

먼저 새롭게 S3 버킷과 Cloudfront를 생성하면서 IAM유저 또한 새로 생성했는데 이 과정에서 문제가 발생한건지 확인해봤다.

기존에 정상적으로 작동하던 S3 버킷과 Cloudfront 설정을 확인해보고 IAM 유저 또한 동일하게 S3에 대한 전체 권한을 허용했는지 체크했고 문제가 없는 것으로 확인됐다.

정확한 확인을 위해 기존에 정상적으로 작동하던 프로젝트에서 새로 만든 IAM유저,S3 버킷,Cloudfront를 연동해서 API를 호출했을 땐 문제 없이 정상적으로 URL이 발행되는 것을 확인했다.

그러므로 우선 AWS의 문제가 아닌 내 코드에 문제가 있다는 것을 확인했다.

2. .env 파일 문제?

그렇다면 S3 client를 생성할 때 .env에 입력된 값을 사용하는데 .env파일이 문제는 아닐까? 싶었지만, 위에서 시도한 것처럼 다른 프로젝트에서 .env에 액세스 키 등 변수를 변경하고 API를 호출했을 땐 문제가 없었던 것을 보아 .env 파일에 입력된 값에는 문제가 없었다.

그러면 .env를 제대로 불러오지 못하는지 확인하기 위해 console.log를 통해 입력된 환경변수를 출력해봤다.

역시나 .env를 정상적으로 불러오는 것을 확인할 수 있었다.

해결

결론적으로 문제는 S3 client를 선언할 때 .env파일이 아직 로드되지 않았기 때문이었다.
credentials 에 async를 추가함으로써 이 문제는 해결되었다.

    this.s3Client = new S3Client({
      region: process.env.AWS_REGION,
      credentials: async () => ({
        accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
        secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
      }),
    });

0개의 댓글