Cloudflareとスポットインスタンスを組み合わせて稼働させる

シェアする

Voiced by Amazon Polly

お金を節約するのは大切です。EC2ではスポットインスタンスを使用することで、インスタンスが停止される可能性があることと引き換えに料金を大幅に低減させることができます。
しかし、もしインスタンスが停止された場合、インスタンスのパブリックIPアドレスは変更されてしまいます
Elastic IPをつければIPアドレスは固定できますが、停止中はElastic IPの料金がかかりますし、Elastic IPを使える数にも制限があります。

広告



CloudflareをDDNS化するため、内側からシェルスクリプトを叩く

既存のスクリプトを改修し、CloudflareのDNSレコードを更新するスクリプトを作成しました。
ddclientを入れるのが面倒だったというのがあります。このスクリプトを使用した場合、curlが入っていれば特別なソフトウェアは必要ありません。
https://gist.github.com/ryuzoji/4eec2b70210ac6ace910fc0070b54d1b
変更点としては、パラメータを引数で指定できるようにしたこと、パブリックIPアドレスをインスタンスメタデータから取得したものになります。

インスタンスメタデータからパブリックIPアドレスを取得しているため、EC2およびLightsailインスタンス以外では正常に動作しません
それ以外のサーバーでダイナミックDNSとして使う場合は、14行目をパブリックIPアドレスを取得できる別のサービスに更新する必要があります。

スクリプトの使い方

実際に使用するにあたっては、まずスクリプトを設置して実行権限を付与します。
スクリプトの実行は、rootである必要はありません。設置後、次の4つの引数を指定してcronで定期的に実行するようにします。
cloudflare-update-record.sh (メールアドレス) (APIキー) (ゾーン名) (レコード名)
メールアドレスは、Cloudflareに登録済みのものです。APIキーはCloudflareにログイン後、アカウント設定から取得してください。
ゾーン名は、そのドメインのルートレベルの名前です。例は、example.comです。
レコード名は、更新するサブドメインの名前です。例は、sub.example.comです。

Apexおよびnaked domainを更新しようとすると、IP changed to:が表示されてもレコードが更新されない場合があります。
この場合、代わりにwwwレコードを更新してください。ApexにCNAMEでwwwをポイントすることで、実質的に解決できます。
ApexにCNAMEを設定した場合、CloudflareはFlatten CNAMEによって自動的にIPアドレスに変換するため、DNSの仕様に厳密に沿っていなくても問題ありません。
無料プランでは、Flatten CNAME at rootに設定されており、Apexのみ対象となっています。

インスタンスが停止された場合のCPUクレジットは?

T2およびT3インスタンスを使っている場合は、インスタンス停止時の蓄積されたCPUクレジットの存在が気になるかと思います。
T2インスタンスの場合は、停止されるとすぐにCPUクレジットがすべて失われます。再起動されると、起動CPUクレジットを取得できます。

当該アカウント内で、過去24時間以内に100回以上T2インスタンスが起動されている場合、起動CPUクレジットは取得できません。

T3インスタンスの場合は、停止されても7日間はCPUクレジットが保持されます。停止から7日以内に再起動された場合は、停止直前までのCPUクレジットを引き継げます。

趣味程度のサイトなら、なんとかなる

趣味程度のサイトであれば、たまに停止しても問題ないものかと思います。しかし、小型のインスタンス(T2/T3インスタンス)に関しては停止される頻度は現状で非常に低いものとなっており(5%未満)、スポットインスタンスの価格が急上昇しない限りはほぼ停止されることなく使用できます。

止まらないことは保証できないため、止まると困るサービスに対しては素直にオンデマンドインスタンスを使用してください。スポットインスタンスの価格が、オンデマンドインスタンスの価格を超える場合があるからです。

スポットインスタンス停止時の動作に関しては、必ず停止(Stop)を選択してください。終了(Terminate)を選択すると、インスタンスやデータが削除されてしまいますのでご注意ください。