Apache Proxy HTTP and WebSocket with SSL certificate(Self-signed)

<IfModule mod_ssl.c>
        <VirtualHost *:443>
                ServerAdmin webmaster@localhost
                ServerName api.example.com
                ServerAlias api-dev.example.com api-prd.example.com

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                SSLEngine on
                SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
                SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key

                ProxyPass / http://localhost:8443/
                RewriteEngine on
                RewriteCond %{HTTP:Upgrade} websocket [NC]
                RewriteCond %{HTTP:Connection} upgrade [NC]
                RewriteRule ^/?(.*) "ws://localhost:8443/$1" [P,L]
        </VirtualHost>
</IfModule>

mod_proxy_wstunnel 모듈 활성화 필요

EC2 인스턴스 Export하고 VMware에 Import하기

EC2 인스턴스를 S3 버킷으로 내보내고 VMware에 추가하는 방법

create-instance-export.json
파일 생성 후 아래와 같이 작성
“S3Bucket”의 값인 “create-instance-export-task”은 Export될 버킷의 이름을 넣는다.

{
    "ContainerFormat": "ova",
    "DiskImageFormat": "VMDK",
    "S3Bucket": "create-instance-export-task",
    "S3Prefix": "vms/"
}

RUN Command line

aws ec2 create-instance-export-task --instance-id i-00000000000000000 --target-environment vmware --export-to-s3-task file:///Users/user-name/create-instance-export.json 

결과

{
    "ContainerFormat": "ova",
    "DiskImageFormat": "VMDK",
    "S3Bucket": "create-instance-export-task",
    "S3Prefix": "vms/"
}

내보내기(Export) 작업 진행 확인

aws ec2 describe-export-tasks --export-task-ids export-i-0000000000000000
{
    "ExportTasks": [
        {
            "ExportTaskId": "export-i-00000000000000000",
            "ExportToS3Task": {
                "ContainerFormat": "ova",
                "DiskImageFormat": "vmdk",
                "S3Bucket": "create-instance-export-task",
                "S3Key": "vms/export-i-00000000000000000.ova"
            },
            "InstanceExportDetails": {},
            "State": "active"
        }
    ]
}

Express.js Send file stream from URL

Express.js에서 다른 Static 서버의 파일을 전달하는 방법에 대해 알아본다

첫번째 방법

다른 Static 서버 파일의 스트림을 가져온 뒤 클라이언트에게 스트림
HTTP인 경우 http 사용, HTTPS는 https 사용
클라이언트는 Express에서 스트림을 받고 Express는 Static 서버에서 스트림을 받는다.

router.get('/', (req, res) => {
  const externalRequest = https.request({
    hostname: 'images.unsplash.com',
    path: '/photo-1652088070524-f39f6a26d36b?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1287&q=80'
  }, (externalResponse) => {
    res.setHeader('content-disposition', 'attachment; filename=thumbnail.png');
    externalResponse.pipe(res);
  });
  externalRequest.end();
});

정상적으로 동작한다. 대신 스트림을 Express 서버가 중계하므로 레이턴시가 증가하는것을 확인할 수 있다.

CDN 사용하는 경우 위 방법으로 스트림을 전달하면 지리적으로 분산된 CDN 서버 사용의 이점이 상실된다.
*Express 서버가 지리적으로 분산되지 않았다는 가정

두번째 방법

Redirection 리다이렉션(302)
간단하지만 클라언트에서 Static 서버로 접근하는것도 동일하다. 클라이언트는 스트림을 Static 서버로 부터 받는다.

router.get('/', (req, res) => {
  res.redirect('https://images.unsplash.com/photo-1652088070524-f39f6a26d36b?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1287&q=80');
});

Express 서버를 거치지 않고 Static 서버로 바로 접근하기 때문에 레이턴시가 상대적으로 작다.

결론

  • API(Express) 서버는 공개되어있으나 리소스 서버가 내부망에서만 접근이 가능한경우 첫번째 방법을 사용하여 외부에 리소스를 API를 통해 제공하면서 리소스 서버의 구성을 그대로 유지할 수 있다.
  • 리소스 서버가 HTTP 방식만 지원할 경우 클라이언트의 보안정책에 따라 접근이 불가할 수 있다.
    API(Express) 서버를 통해 HTTP/S 프로토콜로 리소스를 제공할 수 있다.

VMware ESXi에서 복제된 Ubuntu VM IP 충돌 시 해결방법

VMware ESXi 7.0 에서 하나의 Ubuntu 템플릿을 만들고 해당 이미지를 복제하여 사용하던 중 IP 주소가 동일하게 설정(유지)되는 것을 확인했다. 당연히 네트워크 통신자체가 되지 않는다.

선택사항이다. 네트워크 상에서 식별을 쉽게 하기위해 호스트네임을 변경해준다.

sudo hostnamectl set-hostname "example-vm"

복제된 서버에서 아래의 명령어를 차례로 입력한다. 마지막 “sudo reboot” 명령 실행 시 시스템이 재시작된다.

sudo rm /etc/machine-id
sudo systemd-machine-id-setup
sudo reboot

아래 명령어로 할당된 IP 주소를 확인한다.

ifconfig