S3 파일삭제시 CredentialsError
,Could not load credentials from any providers
에러 해결하기
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
}
# 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;
}
);
};
}
app.js
에 전역으로 설정한 값으로 사용했었기에 문제가 없어 보였다.undefined
를 보았고, 환경변수를 못 읽어오고 있었다.dotenv
라는 모듈을 항상 사용해 왔었는데 이런 경우는 처음이었다.process.env
객체를 콘솔로 찍어서 확인해 보아도 .env
파일에 선언해 주었던 환경변수들은 보이지 않았다.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
에 업로드된 객체를 삭제하는 작업도 정상적으로 수행되었다.aws-sdk
가 자격증명을 확인하지 못해 발생한 문제였다.dotenv.config()
를 통해 적용해 주면 전역으로 적용되는 줄 알고있었는데 아닌 것 같다. 더 찾아봐야겠다.