はじめに
Azure Container InstancesでHAProxyをサイドカーとして実装する手順を説明します。
HAProxyをサイドカーして実装すると以下のような機能をContainer Instancesに実装することが可能です。
- リバースプロキシ
- ロードバランシング
- SSLオフロード
- ヘッダー書き換え
- HTTP圧縮
- ロギング
- トラフィック制御
などなどHAProxyの機能に準じます。
本稿ではリバースプロキシ、SSLオフロード機能を実装し、Container InstancesのHello Worldを表示します。
手順は大きく以下のようになります。
- HAProxyのイメージ作成
- デプロイ
HAProxyはvolumeMountsで /usr/local/etc/haproxy
をマウントできないのバグなのか仕様なのか不明ですが現状はConfigを含んだイメージを作成する必要があります。
やり方しってたら教えてください。
下記を参考した応用になります。
-
サイドカー コンテナーで TLS を有効にする - Azure Container Instances | Microsoft Learn
サイドカー コンテナーで Nginx を実行することで、Azure Container Instances 内で実行されるコンテナー グループに対して SSL または TLS エンドポイントを作成しま ...
learn.microsoft.com
HAProxyを単体で実装したい場合には下記を参考にしてください。ただしこれは仮想ネットワークを利用しているため外部からのアクセスを利用できません。
-
リバースプロキシとしてAzure Container InstancesにHaproxyを導入してみる - 技術的な何か。
はじめに インターナルのLoad Balancer の代わりにHaproxyを導入したい、だけれども仮想マシンのメンテナンスしたくないので他に方法はないのかということでAzure Container
level69.net
HAProxyイメージの作成
HAProxyのイメージを作成します。/usr/local/etc/haproxy/pem/haproxy.pem
に自己証明書を配置します。
バックエンドは127.0.0.1
を指定します。
haproxy.cfg
defaults mode http timeout client 10s timeout connect 5s timeout server 10s timeout http-request 10s frontend myfrontend bind *:443 ssl crt /usr/local/etc/haproxy/pem/haproxy.pem option forwardfor default_backend myservers backend myservers server server1 127.0.0.1:80
Dockerfile
を作成します。ここではバージョンに注意する必要があります。2.3
以外だと動作を確認できませんでした。latest
では起動できませんでした。
FROM haproxy:2.3 COPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg
ビルドします。
docker build -t haproxysample4 .
タグとつけます。
docker tag 7d1c749ada91 jkudo/haproxysample4
Pushします。
docker push jkudo/haproxysample4
以上でイメージの作成は完了です。
Container Instances へのデプロイ
ACIへのデプロイはAzure CLIでyamlを利用したデプロイです。
自己署名証明書を作成し、Base64でエンコードする必要があります。エンコードしたものをyamlに書き込みContainer内に配置しましす。
openssl req -new -newkey rsa:2048 -nodes -keyout ssl.key -out ssl.csr openssl x509 -req -days 365 -in ssl.csr -signkey ssl.key -out ssl.crt cat ssl.crt ssl.key > ssl.pem
base64にエンコードします。
cat ssl.pem | base64 > base64-ssl.pem
改行が邪魔なのでsedで改行削除します。
sed -z 's/\n//g' base64-ssl.pem
出力された文字列を控えておきます。yaml内に書き込みます。 yamlを作成します。
deploy-aci.yaml
api-version: 2019-12-01 location: eastus name: app-with-ssl properties: containers: - name: haproxy properties: image: jkudo/haproxysample4:latest ports: - port: 443 protocol: TCP resources: requests: cpu: 1.0 memoryInGB: 1.5 volumeMounts: - name: haproxy-config mountPath: /usr/local/etc/haproxy/pem - name: my-app properties: image: mcr.microsoft.com/azuredocs/aci-helloworld ports: - port: 80 protocol: TCP resources: requests: cpu: 1.0 memoryInGB: 1.5 volumes: - secret: haproxy.pem: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURFVENDQWZrQ0ZFb2tFaXNmdFo2Z3lPZER5RXdPTUV4NGlENHlNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1FVXgKQ3pBSkJnTlZCQVlUQWtGVk1STXdFUVlEVlFRSURBcFRiMjFsTFZOMFlYUmxNU0V3SHdZRFZRUUtEQmhKYm5SbApjbTVsZENCWGFXUm5hWFJ6SUZCMGVTQk1kR1F3SGhjTk1qTXdNakEwTVRFME56RTFXaGNOTWpRd01qQTBNVEUwCk56RTFXakJGTVFzd0NRWURWUVFHRXdKQlZURVRNQkVHQTFVRUNBd0tVMjl0WlMxVGRHRjBaVEVoTUI4R0ExVUUKQ2d3WVNXNTBaWEp1WlhRZ1YybGtaMmwwY3lCUWRIa2dUSFJrTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQwpBUThBTUlJQkNnS0NBUUVBd3h6VGhVK24rZm11dkRTakdxZEl6TjFVY1plT2lHTUZpcWw1VXJVcWRwYmNuOEI2CkUrSm5qdDZ0b1JYZGJZbUdwWGlrcTJCZlptUkVuN3g5ek5ya0NNcTdybFh5ZXluQk92NHlCZnFSMmdMK0VHTGUKaFBUVDR3WWQxWGNEM2tMS0RLY1lNanBFVmkyak5tV1M5VWxBVFRiTE5IUEs4V3Y1V0FBMzVUazRCNVlsVDE0dgpDREJiV04vaGhuenZUMkVaeFhhclE4RXFtTG5jdW9QREsxZkNtWU90K2Q1S0dmREdOUklQck9aRUlHNTRVTDVaCmUxTUpvMnljd2VCakxHaW9jKzR4bkRZbk5DMTlhZDc1SXRBby9JQm5PU1ZoemVpSVZkUjVSOW5xaXMzSDNaSWQKQTVlOTRnN0JlSTIxRlBQb0Urd1dCa3dFWWhZMlR5alZtemtrYndJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQ3dVQQpBNElCQVFCd1dqL2h6N1FmRmZtMEdWZGhVQzZHREFvc0JXYTRYU1JJSzQ3YkRYUFhCbW0xemJxdEFqdi9jQWVTCm1tUFZ0OEJqV2lIcklxNDRWT1V2bmRwUjJPUHlWZ013TFdRU2xXZXU5UDhYd1FOY2NGcW85OVNFN3ZRd1BmTG0Kb2lsZ2lnQzFYMVo0YnI3TFgxM2xqSDRXeXh5clJzTi8wREU4QUdZaUJhckhIaWpzZS91RHN3czl3aHBDOFkwbwpWUm5nM0NoSXpuWlVhU0FXbE9ySDBlOURiNHpJWlZxTzFmdzZEM08rb3FjZXJuWVdqVkJUN0llSDZtNFNTUWlyCk52Zzl2bk1kYUZwMm9NVFJQcXBDdGVpclZvU2FUZFhKNmRqOW8vbFhTYkpERkwvQmF1Smg0dmpxOHRZd2FTWkkKcE0ya1J6aEhYZVdwTjMzdWVHcUg3U0ZuZDVBRAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tQkVHSU4gUFJJVkFURSBLRVktLS0tLQpNSUlFdlFJQkFEQU5CZ2txaGtpRzl3MEJBUUVGQUFTQ0JLY3dnZ1NqQWdFQUFvSUJBUURESE5PRlQ2ZjUrYTY4Ck5LTWFwMGpNM1ZSeGw0NklZd1dLcVhsU3RTcDJsdHlmd0hvVDRtZU8zcTJoRmQxdGlZYWxlS1NyWUY5bVpFU2YKdkgzTTJ1UUl5cnV1VmZKN0tjRTYvaklGK3BIYUF2NFFZdDZFOU5QakJoM1Zkd1BlUXNvTXB4Z3lPa1JXTGFNMgpaWkwxU1VCTk5zczBjOHJ4YS9sWUFEZmxPVGdIbGlWUFhpOElNRnRZMytHR2ZPOVBZUm5GZHF0RHdTcVl1ZHk2Cmc4TXJWOEtaZzYzNTNrb1o4TVkxRWcrczVrUWdibmhRdmxsN1V3bWpiSnpCNEdNc2FLaHo3akdjTmljMExYMXAKM3ZraTBDajhnR2M1SldITjZJaFYxSGxIMmVxS3pjZmRraDBEbDczaURzRjRqYlVVOCtnVDdCWUdUQVJpRmpaUApLTldiT1NSdkFnTUJBQUVDZ2dFQVlHS0NIMjROUmhEUkFBcGt0SXNGREtjZHl3dWFqc2VUK2o3a1B6WmQ1cjE1CitiVUUyWVBUc3FGUVZxNU5kNG9qcU9TalBFSGNmdUZ6Z1JHRmQ4aCtNOVdxeDJHUDZzWGl2ZmpLejJkTDI4MzAKb2pXbFJUc0kzVEt0VkVGNStMYzN4dTVZcHA5Z0dNNXN2VGVLVkgrK015YXBWWjBLR1I5RXl2TTRxWlVObDdqMgpvOVl5NlRmeGpUY3lpMzdoTmRpZERvWDVYT1lSMGZWY0ZlM2ptT0lLWDhFMERNYkMrbDV6Snp5UzBKbVVia3pXCmgwNisxckh6dmFTdkJJZXFVTGg3TGpwekhGempieW1kaVdpbi8wR2pHYnQ3MzRCcVNMR0ZseEhtdVlQVXZyNDUKZ3gyTG4vUDJ1K09ySDhITVhMYUNBU1V3eDdFVnB5ci9JZ3VON2JXcXdRS0JnUUQvaGIvaytUNkpkRTFOSlNtSgpYa0VORlBGS0ZmbWVGajBzZm9kSTVMMzVHeTkvQzhrQlA1ckVCOFJ5NzlMRDBsV2JaMHZSTlFPb0pTekljdVNuCjV4S3Myb1Awdjd4dFBodEFNbXFOUWlxQ01pTEQ5cjEwK0x1MXJkdWxNVHRxTUtRZnBuQzRJS1gzM3REQ3oxenEKd242eWRXdUNvZmFXSWNqcFB4cjRBbDUzendLQmdRRERlaXl4eXBwSGs1Um9lU0dqd1hZTzlUWTRYTGJKbkFhKwpBN2ZFUWpVRm1VZkhPNzRacVM0N0FHWktaL0ZUVURMRzBWSG56cjZ5WlhUYnpaRUQ3YVVtM3RvcjJxSVNQUUh2Cnc1cFZlQVVsUmZmMzVFaGNXVmtGeTgzY2s5bmtMWUtlMmJKb3BYM3E3TjUvYmJKSHFFRGppekxyRytORkRVMXEKMFZQbXJqY1JZUUtCZ1FDL1pLNmMwdmk5dXFpZ0xVTFVpdzRNdjNBUXZ5OE84N2QwbVgyNTR1Uk5MOGkrejlRSwpwRnJIbE0zWURiMEFRbzh1N1F1RU04Sitjd0g5VHRub3poTlYrQU01RTFrUE5xTHd6aEt6cGlqekJweTF6aDZRCi9ES1YzaGtVdmpDejFLVktzNy9nbTB2VncwYjVkSnN6bU9XUHhKWDM3bHNtanozUFFCNXlRRXdFVHdLQmdCRFkKcHFGcjVIL21xQk9ZM04xUC91eXJGVkVtTEZxVHA4RVljTzNwQnNqRXZQcmVtek42OFJFRXA4d2h5UnAwL3V0RApmdHVMWmNQYUdvZ1czemlIY29RM0VIWlhFVUNoSVZtWWNlU0x3MlhDOGV2Yk1LRkUwZmM5NlMvcFRnM3NIaVd5CmZUMm5oWUtKaDJOVUFObE1Gc3VGWTQzL2lVYWFMdUhWeUhWSTdsWUJBb0dBYVRCMVpBR1k2dnRSczljOTJFcXIKSVZGWHo2TWozd1pvYlNUQXExYXhXRVZKMjZFZGk1Z2pVenJ6T1JWWGV2RXVlcUVFNm14ek5FVlVmdkxzSHk4WQpEUE1tR1A0MTB0azJCU1VIekMrMzIrejlIdkxHZHZRamdWcGNLd05jSXFDNnNoRS9jRWxBaFdyRGZ4NFlXZUxuCnJUb2V3VzE5VGx6d1NQZTNCYUhYYlNRPQotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tCg== name: haproxy-config ipAddress: ports: - port: 443 protocol: TCP type: Public osType: Linux tags: null type: Microsoft.ContainerInstance/containerGroups
デプロイします。
az container create --resource-group app-with-ssl --file deploy-aci.yaml
あとはアクセスします。自己署名証明書なので警告になっていますが、問題なくSSLでつながっていることがわかります。
まとめ
HAProxyをサイドカーとして実装することで、ACI内部での取り回しが楽になるのではないでしょうか。