0. はじめに
AWSのグローバルIPv4アドレス(パブリックIP)が有料化され早2年。
影響は大きくEC2インスタンス1台しか使っていないのにAWS料金が上昇。
レンサバよりも安くなると聞いて始めたAWSなのにどうしてこうなった。
ただでさえ円安でAWSは値下げしたと発表するも我々にとっては値上げ続きのAWS料金。
しかし、IPv4でアクセスできないサーバとかありえません。
従来の使い方を維持しつつ、IPアドレス課金を回避する方法を考えます。
1. IPアドレス課金でAWS料金が3割値上げ
田舎あるあるLAMP全部入りEC2インスタンス(もちろんt2.micro)1台のAWS環境。
月額11ドル程だったt2.micro EC2インスタンスが15ドル近くに大幅値上げ!
円安もあって月額2000円超え。これが続くようではレンサバへ戻す事になります。
IPv4でのホームページ提供とSSHは絶対条件として課金を回避しなければなりません。
そもそも何故課金されるのか
以前は稼働中のEC2インスタンスへアタッチされたEIPは1個まで無料でした。
これが状態に関係なく常時有料になったことが原因です。
その価格たるや $0.005/時、月額約3.6ドルと安くない。
みんな大好きEC2 t2.microが月額約11ドルですから影響の大きさがわかります。
2. まずはホームページを対応
EC2インスタンスからパブリックIPを削除するとインターネットからの接続性が失われます。
何らかのインターネットからアクセス可能なサービスを経由してEC2インスタンスへ接続する必要があります。
(却下) Elastic Load Balancing (ELB) 経由
古き良きベストプラクティスに従い、EC2インスタンスをプライベートサブネットに置きELBを使ってホームページを公開する方法を試そう考えます。
しかしELBのIPアドレスも課金対象だったのでした。
そしてそもそもELB自体が有料(無料利用枠終了後)ですから逆に高くなってしまいます。
却下。
Amazon CloudFront 経由
Amazon CloudFront のIPアドレスは課金対象外であることに気づきます。
これは利用者が作成したものでなく、複数の利用者で共有するAWSリソースだからです。
しかし CloudFront のオリジンに EC2インスタンス を指定することはできない。
それには ELB を経由しなければならない。というのは皆が知るところであります。
が、それは過去の知識になったようです。
Amazon CloudFront VPCオリジン が登場
ELB 不要で EC2インスタンス を直接接続可能になりました。
当初はグローバルIPv4アドレス(EIPやパブリックIP)を持つEC2インスタンスのみが対象でした。
アップデートでインターネット接続性の無いプライベートサブネットの EC2インスタンス も接続可能に。
これだ。
VPCオリジン を利用する場合は Pay as you go
最近はディストリビューション作成時に料金プランを選択するようになりました。
大きく表示されている無料の Free $0 を選択したら利用できず最初失敗しました。
画面の一番下に小さくある Pay as you go を選択します。
従来のディストリビューションは全てこれです。零細企業のホームページなら課金されることはまずありませんから安心してこれを選択しましょう。
あとはオリジンタイプにVPCオリジンを指定して EC2インスタンスのARNを入力すれば完了です。
3. EC2インスタンスへTeraTermでSSH接続する
EC2インスタンスからパブリックIPを削除するとこれができなくなってしまいます。
現在は AWS マネジメントコンソールから EC2 Instance Connect や SSM Session Manager 等でログイン可能なのはわかっています。
しかしそうではなく、レンサバと同じ感覚で自分の端末からTeraTermでSSH接続できなければ不便です。
AWS CLI で EC2インスタンス へSSH接続可能だけど…
AWS CLI を使用すると自分の端末からコマンド一発でプライベートサブネットの EC2インスタンス にもSSH接続出来ます。
aws ec2-instance-connect ssh --instance-id インスタンスID
一見これで問題なさそうに見えますが、あくまでこれはコマンドプロンプトかPowerShell上で動いています。
つまりコントロールキー等の操作ができず使い勝手が悪いのです。
却下。
やっぱりTeraTermでSSH接続したい
AWS CLI の ec2-instance-connect コマンドに open-tunnel なるトンネリング機能が有ることに気づきます。
これだ。
aws ec2-instance-connect open-tunnel --instance-id インスタンスID --local-port 22
このトンネルはつなぎっぱなしにできますから、スタートアップに仕込んでおけば意識せずに使う事ができます。
あとはいつも通りTeraTermで127.0.0.1 (localhost) へSSHするだけです。
平和が戻りました。



