🐈

EC2の無料枠でDiscord Botをタダで動かしたかった話

に公開

この記事では、EC2の無料枠でDiscord Botを無料で動かそうと試行錯誤した話です。
そのまま葬っておくのも勿体無いので残しときます。

無料枠

まず、EC2の無料枠についての話です。AWSには6ヶ月無料枠が存在しますが、それとは別にEC2に無料枠が存在します。
2025年12月31日までt4g.smallが月750時間使えるみたいです。
どうやら、この無料枠はしれっと毎年伸ばされているみたいです。多分来年も延ばされます。(希望的観測)

t4g.small
vCPU 2vCPU
メモリ 2GiB

https://aws.amazon.com/jp/ec2/faqs/?nc1=h_ls#t4g-instances

結論から言うと、現状ではこの無料枠だけでDiscord Botを運用することはできません

原因不明の課金

まず、このEC2+Elastic BeanstalkでBotを動かそうとしました。実際に成功して、それを記事に書こうと思ってました。が

🤔なんか課金されているな
とりま環境を削除して、原因を調べてみるとVPCに課金されていることが分かりました。幸い課金はクレジットで相殺されました。

IPv4アドレスの有料化

とはいえ、原因を放置するわけにはいかないのでVPCの何に課金されていたのか調べてみると、このアナウンスに辿り着きました。

https://aws.amazon.com/jp/blogs/aws/new-aws-public-ipv4-address-charge-public-ip-insights/

We are introducing a new charge for public IPv4 addresses. Effective February 1, 2024 there will be a charge of $0.005 per IP per hour for all public IPv4 addresses, whether attached to a service or not (there is already a charge for public IPv4 addresses you allocate in your account but don’t attach to an EC2 instance

ざっくり訳すと、「2024年2月1日からIPv4アドレスには1時間につき0.005ドルの課金するんでよろしく。」ってことらしい。
30日保持していると30日 * 24時間 * $0.005 = $3.6となり、無料枠を使いたい身にはなかなかの負担となります。
たかがIPアドレスにお金かけたくないので何とか無料枠だけで運用しようとしました。

IPv6を割り当てる

一方で、IPv6のアドレスは無料です。
ならIPv6だけ割り当てればいいやんってことで、EC2にIPv6を割り当て、IPv4を削除しました。が、動かない。

調べてみると、AWSのIPv6の対応状況をまとめてあるリストがありました。

https://docs.aws.amazon.com/vpc/latest/userguide/aws-ipv6-support.html

Service name Dual stack support IPv6 only support Public endpoints support IPv6 Private endpoints support IPv6
AWS Elastic Beanstalk Yes No Yes Yes

Elastic BeanstalkはIPv6のみの構成では使えないようです。

挫折

しかし、Beanstalkが使えなくてもEC2で直接起動するというルートが残っています。
幸いDockerHubやQuay.ioはIPv6に対応しています。

https://blog.miyuru.lk/ipv6-docker-registries-2025/

CI/CDもGithub ActionsとAWS Systems Manager Run Commandを組み合わせれば実装できます。(ちなみにGithubはIPv6非対応なのでssh接続はできません。)

とりあえず、CI/CDを構築する前に起動させて見ようとしました。

自分の環境はAMDなので、arm64で動くようにビルドして、DockerHubにアップします。

docker buildx create --name multiarch --driver docker-container --bootstrap --use
docker buildx build --platform linux/arm64 \
  -t [YOUR_USER_NAME]/[USER_REPOSITORY] \
  --push .

次にEC2にSSH接続して、DockerHubからpullします。(Dockerは入っている前提)

docker pull [YOUR_USER_NAME]/[USER_REPOSITORY]

自分のBotは.envを使っていたので、vimで書き込みます。

vim .env

dockerに.envを渡して起動します。

docker run --env-file .env [YOUR_USER_NAME]/[USER_REPOSITORY]

これでDiscord Botが起動する…と思っていたのですが。
いつまで経っても、Botがオンラインにならないし、ログを確認してもここから進まない。本来なら discord.gateway Shard ID None has connected to Gatewayってのが出るはずなのに。

Bottle v0.13.4 server starting up (using WSGIRefServer())...
Listening on http://0.0.0.0:8080/
Hit Ctrl-C to quit.

2025-09-11 05:13:37 INFO     discord.client logging in using static token

もしや、Discord APIはIPv6に対応してないんじゃないかと思い、調べるとこんなものが見つかりました。

https://github.com/discord/discord-api-docs/issues/6695

This is currently working as intended as we do not support ipv6.

詰みです。

今北産業

  • EC2には6ヶ月無料枠とは別に無料枠がある。
  • AWSのIPv4アドレスには料金がかかる。
  • Discord APIはIPv6非対応。

まとめ

EC2の無料枠はIPv6しか使えないため、Discord Botを運用できないトラップがある話でした。
ただ、個人的には、無料枠だけでの運用が出来ないだけで、料金を払う前提なら決して悪い選択ではないと思います。(むしろ4ドル程度で済むならコスパいい)
IPv6の普及率の悪さを認識する機会にもなりました。せめてAWS内のIPv6普及率もっと上げてからIPv4有料化してくれ

最後まで読んでいただきありがとうございました。
(この無料枠何に使えるんだろ)

GitHubで編集を提案

Discussion