[AWS] EC2 - S3 access denied 해결하기

스윗포테이토·2023년 1월 16일
0

지난 글에서 aws-sdk for javascript를 통해 s3 버킷에 접근에 성공했었다. 그러나, 로컬에서는 잘 동작하는 것이 이상하게 EC2 인스턴스에서는 동작을 하지 않았다.

사용한 코드 전문

const express = require("express");
const app = express();
require("dotenv").config();
const port = process.env.EXPRESS_PORT;

const { S3Client, ListBucketsCommand } = require("@aws-sdk/client-s3");

const s3Client = new S3Client({ region: "ap-northeast-2"});

// s3 버킷 정보를 불러와서 출력하는 예제
async function testConnection() {
 try {
   const data = await s3Client.send(new >ListBucketsCommand({}));
   console.log("Success", data);
   return data; // For unit tests.
 } catch (err) {
   console.log("Error", err);
 }
}

testConnection();
/**
* 서버 시작
*/
app.listen(port, () => {
 console.log(`listening ${port}`);
});

물론 env 파일도 잘 설정되어 있었고, 하다 하다 안되어서 key 값을 직접 credential 객체에 넣어서 전달도 해보았지만 계속 403 AccessDenied 가 떴다.

알고보니... 과거의 내가 쌓아둔 업보였다.
처음 S3 버킷을 파고 EC2에서 연결을 하기 위해서 엔드포인트 설정을 해두었는데, (과거의 글...) 알고보니 이 권한이 문제였다.

이 때는 이 엔드포인트로는 get요청만 하고, 나머지 요청은 aws-sdk에 키 값을 넣어서 할 것이라고 생각하고 엔드포인트 정책에 GetObject 권한만을 주었었다.
그러나 여기서 이미 권한이 좁혀져서, IAM으로 생성한 키나 역할에 FullAccess를 주어도 listBucket, 혹은 put 요청은 AccessDenied가 되는 것이다.
따라서 해결방법은 다음과 같다.

[VPC 콘솔] > [Endpoints]
지난번 생성한 Endpoint의 Policy의 정책을 수정해주면 된다.

이제 S3로의 접근은 전부 endpoint를 거칠 것이므로, 기존 로컬에서 사용하던 것처럼 IAM user 키를 사용해서 접근을 할 필요가 없다. 따라서 사용했던 IAM 유저는 삭제해도 된다.(물론 로컬에서 접속하려면 필요하다.) EC2 인스턴스에서 S3 엔드포인트로 연결이 가능하므로, 별도의 credential을 입력하지 않고 그냥 하면 된다.

const s3Client = new S3Client({ region: "ap-northeast-2"});

애초에 VPC 구성을 하지 않았다면 그냥 IAM 키로 바로 해결 되었을 문제지만, 내가 EC2를 S3의 프록시로 쓰려고 이전해 해둔 설정이 문제가 되었던거 같다. 그러나 공식문서를 살펴보니 이 방식을 더 권장한다고 한다. ENV 키 파일을 애초에 인스턴스에 저장하지 않아도 되어 보안적으로 더 나은 선택이라고 함!!!


reference

Why can’t I connect to an S3 bucket using a gateway VPC endpoint?

profile
나의 삽질이 미래의 누군가를 구할 수 있다면...

0개의 댓글