저번 글에서 다뤘던 S3를 사용 해보자.
S3는 특정 VPC에 종속되지 않는다.(여러 군데에 다중 복제 저장을 해야하므로) 이런 경우 S3의 /picture 디렉토리 아래에 저장되는 리소스는 전부 다 퍼블릭, 클라이언트를 위한 컴퓨팅을 하는 EC2가 프라이빗 서브넷이 존재할 때, 이 EC2 내부의 WAS가 성공적으로 S3에 사진을 업로드 하는것이 불가능하다. EC2 자체가 프라이빗 서브넷이기 때문에 근복적으로 외부 네트워크와 통신이 불가능하기 때문이다. 따라서 만약 S3가 VPC에 속한다면 VPC끼리 피어링을 통해서 해결을 할 수 있겠지만, 앞서 말했듯 S3는 VPC에 종속되지 않기 때문에 VPC 엔드포인트를 사용해야한다. 여기서 VPC 엔드포인트는 간단히 설정을 해준 대상이 퍼블리과 통신이 가능하도록 해주는 서비스이다. 하지만 VPC 엔드포인트를 사용하는 것은 비싸기 때문에 컴퓨팅 인스턴스를 퍼블릭에 두는 것을 추천한다.


S3 홈 대시보드에서 오른쪽을 보면 버킷 만들기 버튼을 누른다.

리전과 이름을 설정하고 퍼블릭으로 설정해야 하기 때문에 아래 사진과 같이 체크를 해제하고 퍼블릭임을 명심한다는 체크를 해준다.

이렇게 설정하고 버킷 만들기를 클릭하면 버킷이 생성된다.
생성된 버킷으로 들어오면 가운데에 업로드라는 버튼이 보이는데

여기서 사진 한장을 업로드 하고 들어가보면


객체 URL을 통해 업로드 된 사진에 접근이 가능하다.

하지만 이렇게 Access Deny 되었다는 문구가 보이는데 이를 해결하기 위해 추가적 설정이 필요하다.

만든 S3의 속성탭의 맨아래에 보면 정적 웹 사이트 호스팅이 존재하는데 이 기능을 활성화 해준다.

참고로 인덱스 문서, 오류 문서의 이름은 직접 입력해주어야 한다.
다음은 S3 내부 객체에 대한 권한을 설정해주어야 한다.

버킷 정책의 편집하기를 눌러서 정책을 다음과 같이 수정하자.
{
"Version": "2012-10-17",
"Id": "Policy1689489055171",
"Statement": [
{
"Sid": "Stmt1689489029299",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "[각자의 S3 버킷 arn]/*"
}
]
}
위의 설정중 간단하게 Effect, Principal, Action, Resource 정도만 설명을 하면, 우선 Effesct는 허용을 할 것인지 거부를 할 것인지를 설정하는 것이며 Principal은 대상을 지정하는 것이다. "*"은 모든 대상을 말한다. Action은 어떠한 행위에 대한 설정을 지정하는 것으로 GetObject는 S3로부터 받아오는 것이고, PutObject는 S3로 업로드 하는 것을 의미한다. 마지막으로 Resource는 어떤 버킷의 어떤 폴더를 원하는 지를 지정하는 것이다. 이렇게 Resource와 Principal을 적절하게 지정하여 정교한 권한 관리가 가능하다.
이렇게 설정을 한 후 다시 사진에 접근해보면

퍼블릭 접속이 되는 것을 볼 수 있다.