S3 CLI CredentialError 해결하기

Seok·2020년 12월 6일
0

AWS

목록 보기
4/4
post-thumbnail

S3 파일삭제시 CredentialsError,Could not load credentials from any providers 에러 해결하기


0. 문제

  • S3에 업로드된 객체 삭제 요청시 아래와 같은 오류가 발생했다.
message: 'S3 Object delete fail',
  errno: -64,
  code: 'CredentialsError',
  syscall: 'connect',
  address: '169.***.***.***',
  port: 80,
  time: 2020-09-23T07:28:23.237Z,
  originalError: {
    message: 'Could not load credentials from any providers',
    errno: -64,
    code: 'CredentialsError',
    syscall: 'connect',
    address: '169.254.169.254',
    port: 80,
    time: 2020-09-23T07:28:23.235Z,
    originalError: {
      message: 'EC2 Metadata roleName request returned error',
      errno: -64,
      code: 'EHOSTDOWN',
      syscall: 'connect',
      address: '169.254.169.254',
      port: 80,
      time: 2020-09-23T07:28:23.235Z,
      originalError: {
        errno: -64,
        code: 'EHOSTDOWN',
        syscall: 'connect',
        address: '169.***.***.***’,
        port: 80,
      }
    }
  },
  status: 400
}
  • 로그를 읽어보니 자격증명과 관련된 오류로 추정하고 아래와 같은 시도들을 해봤다.
  • S3에 오브젝트를 업로드하는 기능은 이상없이 작동했었기에 이제와서 자격증명과 관련된 오류가 상당히 당황스럽게 했다..

1. 문제 해결 과정

1-1. 코드 확인

# file.service.js

import AWS from "aws-sdk";

AWS.config.update({
  accessKeyId: process.env.ACESS_KEY_ID,
  secretAccessKey: process.env.SECRET_ACCESS_KEY,
});
const s3 = new AWS.S3();

export class FileService {
  static delete = async (req) => {
    const res = s3.deleteObject(
      {
        Bucket: process.env.BUCKET,
        Key: req.params.key,
      },
      function (err, data) {
        if (err) {
          err.message = "S3 Object delete fail";
          err.status = 400;
          throw err;
        } else return data;
      }
    );
  };
}
  • 의심할 곳이 별로 보이지 않았다. 자격증명관련 부분은 5~9 라인 뿐인데 감을 잡을 수 없었다.
  • 이전에 파일 업로드 기능을 구현할 때에 app.js에 전역으로 설정한 값으로 사용했었기에 문제가 없어 보였다.

1-2. 환경변수 확인하기

  • 오타가 있나 차분히 확인 후 이상없음을 확인하고 다음 의심할곳을 찾아보니 process.env 에서 환경변수를 못읽어오나? 라는 생각으로 로그를 찍어봤다.
  • 소름돋게 undefined를 보았고, 환경변수를 못 읽어오고 있었다.
  • 이때까지 dotenv라는 모듈을 항상 사용해 왔었는데 이런 경우는 처음이었다.
  • process.env 객체를 콘솔로 찍어서 확인해 보아도 .env 파일에 선언해 주었던 환경변수들은 보이지 않았다.

1-3. dotenv import

  • 기존에는 app.js파일에 아래와 같은 코드로 내가 .env파일에 작성한 환경변수들을 불러와 쓰고있었다.
import dotenv from "dotenv";
dotenv.config();
  • 그래서 문제가 발생하는 파일인 file.service.js에서 임포트를 해주고 위 내용을 똑같이 작성해 보았다.
import AWS from "aws-sdk";
import dotenv from "dotenv";

dotenv.config();
console.log(process.env);
AWS.config.update({
  accessKeyId: process.env.ACESS_KEY_ID,
  secretAccessKey: process.env.SECRET_ACCESS_KEY,
});
const s3 = new AWS.S3();

export class FileService {
  static delete = async (req) => {
    const res = s3.deleteObject(
      {
        Bucket: process.env.BUCKET,
        Key: req.params.key,
      },
      function (err, data) {
        if (err) {
          err.message = "S3 Object delete fail";
          err.status = 400;
          throw err;
        } else return data;
      }
    );
  };
}
  • 이후 확인해보니 아까 undefined라고 출력하던 환경변수들이 제대로 출력되고 process.env 객체 내용에서도 내가 추가한 환경변수들을 확인할 수 있었다.
  • 더불어 원래 하고자했던 S3에 업로드된 객체를 삭제하는 작업도 정상적으로 수행되었다.

2. 정리

  • 환경변수를 읽어오지 못해 aws-sdk가 자격증명을 확인하지 못해 발생한 문제였다.
  • app.js 에서 dotenv.config()를 통해 적용해 주면 전역으로 적용되는 줄 알고있었는데 아닌 것 같다. 더 찾아봐야겠다.
profile
🦉🦉🦉🦉🦉

0개의 댓글