NestJs에서 AWS S3 연동 시 발생하는 'CredentialsProviderError' 오류 해결하기
안녕하세요, NestJs 개발자 여러분! 오늘은 AWS SDK와 연동하면서 마주칠 수 있는 CredentialsProviderError 오류와 이를 해결하는 방법에 대해 자세히 알아보겠습니다.
문제 상황
NestJs를 사용하여 AWS S3와의 연동을 진행하던 중 아래와 같은 오류 메시지가 출력되었습니다.
{
"code": "CredentialsProviderError",
"message": "Could not load credentials from any providers",
...
}
원인 파악
이 오류는 AWS SDK가 필요한 자격 증명을 찾을 수 없을 때 발생합니다. 자격 증명은 주로 ~/.aws/credentials 파일이나 환경 변수를 통해 제공됩니다.
첫 번째 시도: .env 파일에서 자격 증명 읽기
처음에는 프로젝트의 .env 파일에서 AWS의 자격 증명을 읽어와 ~/.aws/credentials 파일에 작성하는 방식을 사용했습니다.
#!/bin/sh
# .env 파일에서 값을 읽어옵니다
export AWS_ACCESS_KEY=$(grep AWS_ACCESS_KEY .env | xargs)
export AWS_SECRET_KEY=$(grep AWS_SECRET_KEY .env | xargs)
# ~/.aws/credentials 파일에 값을 설정합니다
echo "[default]" > ~/.aws/credentials
echo "aws_access_key_id = ${AWS_ACCESS_KEY#*=}" >> ~/.aws/credentials
echo "aws_secret_access_key = ${AWS_SECRET_KEY#*=}" >> ~/.aws/credentials
서버 배포에 Dockerfile을 사용하고 있기 때문에, Dockerfile도 아래와 같이 설정하여 자격 증명을 설정하도록 했습니다.
# 기본 이미지 설정
FROM node:14
# 작업 디렉토리 설정
WORKDIR /app
# 필요한 파일들을 복사합니다
COPY .env .env
COPY set_aws_credentials.sh set_aws_credentials.sh
# AWS credentials 설정
RUN chmod +x set_aws_credentials.sh && ./set_aws_credentials.sh
# 나머지 설정...
그런데 docker 환경은 제 M1 맥미니 환경과 달라서 이 과정에서 다음과 같은 오류가 발생했습니다
set_aws_credentials.sh: cannot create /root/.aws/credentials: Directory nonexistent
문제 해결: ~/.aws 디렉토리 생성
오류 메시지를 보면, ~/.aws/credentials 파일을 생성하려고 할 때 해당 디렉토리가 존재하지 않아서 발생하는 것을 알 수 있습니다. 따라서 Dockerfile 스크립트에 ~/.aws 디렉토리를 먼저 생성하는 코드를 추가하여 문제를 해결했습니다.
# ~/.aws 디렉토리가 없으면 생성합니다
mkdir -p ~/.aws
이렇게 다행히 오류를 해결할 수 있었습니다.
마치며
AWS와의 연동은 간단한 것처럼 보이지만, 실제로는 다양한 설정과 오류 처리가 필요합니다. 특히 Docker와 같은 컨테이너 환경에서 실행할 때는 파일 시스템과 관련된 문제가 자주 발생하므로 주의가 필요합니다.
오늘의 글이 AWS S3와 NestJs 연동 중 발생하는 문제를 해결하는 데 도움이 되었기를 바랍니다. 계속해서 좋은 정보를 공유하겠습니다. 화이팅! 🚀