본문 바로가기
AWS/S3

S3 Proxy 서버 구성 사례

by 내꿈은한량 2024. 2. 2.

1. 문제

최초에는 S3로 직접 연결 하도록 구성하였으나 A회사의 사내 네트워크에서 사용하는 사설 IP 대역 중에서 서울 리전의 S3 IP 대역(52.*)이 충돌하는 문제가 발생함.

이를 해결하기 위해 충돌하지 않는 EIP 를 생성하여 S3 Proxy 연결하도록 구성함.

2. 해결

2-1. EC2 생성

Instance type m5.large
EIP 13.125.xxx.xxx
Disk Partition * / : 8 GB (root)
* /apps : 30 GB (EBS 추가)

2-2. EC2 생성 이후 변경한 설정

2-2-1. sshd port 변경

기본 port 인 22번에서 40022로 변경

  • 파일 위치: /etc/ssh/sshd_config
Port 40022

 내용 수정 후 sshd 재시작

$ sudo systemctl restart sshd

2-2-2. nginx 설치

Amazon Linux 2 에서 nginx 는 기본 설치 패키지로 포함되어 있지 않기 때문에 yum 명령어로는 설치가 안됨.

[ec2-user@ip-10-200-1-92 ]$ sudo yum install nginx
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
No package nginx available.
Error: Nothing to do


nginx is available in Amazon Linux Extra topics "nginx1.12" and "nginx1"

To use, run
# sudo amazon-linux-extras install :topic:

Learn more at
https://aws.amazon.com/amazon-linux-2/faqs/#Amazon_Linux_Extras

위에서 알려준대로 명령어 실행하면 yum repository 에 amazon extra repository 가 추가된 후에 nginx가 설치됨.

$ sudo amazon-linux-extras install nginx1

2-2-3. nginx 설정

기본 서버 설정은 제거.

$ vim /etc/nginx/nginx.conf
 36 ...
 37 
 38 #    server {
 39 #        listen       80 default_server;
 40 #        listen       [::]:80 default_server;
 41 #        server_name  _;
 42 #        root         /usr/share/nginx/html;
 43 #
 44 #        # Load configuration files for the default server block.
 45 #        include /etc/nginx/default.d/*.conf;
 46 #
 47 #        location / {
 48 #        }
 49 #
 50 #        error_page 404 /404.html;
 51 #            location = /40x.html {
 52 #        }
 53 #
 54 #        error_page 500 502 503 504 /50x.html;
 55 #            location = /50x.html {
 56 #        }
 57 #    }
 58 
 59 ...

별도 설정 디렉토리에 파일 추가.

# cd /etc/nginx/conf.d
# vim s3-proxy-server.conf

/etc/nginx/conf.d/s3-proxy-server.conf

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /apps/doc_root;

        # 데이터 전송 Timeout. 기본값 60초 에서 120초 변경함.
        send_timeout 120s;

        error_log    /apps/nginx_logs/error.log error;
        access_log   /apps/nginx_logs/access.log  main;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
            # VPC 내의 DNS 서버. (VPC CIDR 대역 + 2)
            resolver 10.200.0.2;
            set $bucket "original-s3.s3.ap-northeast-2.amazonaws.com";

            proxy_pass https://$bucket;

            proxy_intercept_errors on;
            # 백엔드 서버에 의해 촉발된 리다이렉션에 대해 "Location" HTTP 헤더에 나타나는 URL을 재작성한다.
            #  - off: 리다이렉션은 설정된 그대로 전달된다.
            #  - default: 호스트명과 현재 문서 경로가 첨부된 proxy_pass 지시어 값이 사용된다. 환경설정은 순차적으로 파싱되므로 proxy_redirect 지시어는 proxy_pass 지시어 다음에 삽입해야 함에 유의한다.
            #  - URL: URL의 일부를 다른 것으로 바꾼다. 또한 재작성 URL 안에 변수를 사용해도 좋다.
            proxy_redirect         off;
            proxy_set_header       Host $bucket;
            proxy_set_header       X-Real-IP $remote_addr;
            proxy_set_header       X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_hide_header      x-amz-id-2;
            proxy_hide_header      x-amz-request-id;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }