michimani.net

AWS を個人で使うときにコストを削減するためにやっていること

2019-10-30

自分で開発したサービスを AWS 上で動かしたいとか、認定試験のために実際に触ってみたいとか、個人で AWS を利用したいシーンは多々あると思います。そんなとき気になるのは、毎月のコストです。勉強代だと思っても、できる限りコストは抑えたいところです。今回は、実際に私が個人で AWS を使う上でコスト削減のためにやっていること・気をつけていることを書いていきます。

目次

コストアラートを設定する

まずは、毎月の請求が来たときにびっくりすることがないようにコストアラートを設定します。

毎月のコストの推移は CloudWatch のメトリクスで監視することができます。ただし請求データとアラームについては バージニア北部 (us-east) リージョンのみで表示・設定が可能となっています。

CloudWatch 請求 ue-east

手順としては普通の CloudWatch アラームの設定方法となんら変わりありません。
対象とするメトリクスは 請求 > 概算合計請求額 > EstimatedCharges (USD) です。これに対して適当な閾値を設定して、 SNS で個人の Slack なりメールなりに通知すれば OK です。

CloudWatch EstimatedCharges

SNS トピックの作成については過去に書いているので参考にしてみてください。

AWS Cost Explorer を使ってコストを管理する

AWS のサービス群には AWS Cost Explorer というサービスがあります。これは AWS の使用状況とコストを可視化して、 どのサービスどのリージョンどの API オペレーション など、非常に細かいレベルでコストの発生状況を確認することができます。
色々と分析の方法はあるんですが、個人的におすすめなのは タグ での分析です。

AWS の各種リソースには タグ として key/value 形式で情報を付与することができます。 そのタグの key を コスト配分タグ として有効化しておくと、AWS Cost Explorer にて同一 key に対して value ごとのコストがわかるようになります。
私の場合は各リソースに Product というタグキーを設定して、そこにプロダクト名をつけています。そして Product タグ key をコスト配分タグとして有効化することで、下のキャプチャのようなグラフを表示することができます。

AWS Cost Explorer tag cost

タグ key をコスト配分タグとして有効化するのは、請求情報ページから実施します。

Billing home

サイドメニューの コスト配分タグ を選択します。

Billing cost tag

既存の AWS リソースに設定されているタグ key が表示されているので、必要なものを選択して有効化します。


AWS Cost Explorer でタグ別分析ができるのは、コスト配分タグとして有効化したあとからになります。たとえ対象のタグを有効化前から設定していたとしても、有効化までに発生したコストに関しては No Tagkey として計算されます。
なので、できるだけ早くコスト配分用のタグを決めて有効化しておくことをおすすめします。


これによって、どんな内容で作成したリソースでどれだけのコストが発生しているかを知ることができます。
個人で開発したサービスをいくつか持っているのであれば、サービスごとのコストがわかります。
参加したハンズオンごとにタグの値を設定しておけば、のちにリソースの削除忘れなどに気付きやすくなるかもしれません。

とにかく、どこにコストがかかっているのかを知るために AWS Cost Explorer を使いましょう。

サービスの無料利用枠を活用する

AWS の各サービスには無料利用枠が設定されているものがあり、ある程度の利用であれば料金が発生しません。なので、これを有効に活用しましょう。
ある程度 というのは、 利用開始からの一定期間 もしくは 特定の条件で無期限 のそれぞれのパターンがあります。

各サービスの無料枠については下記の公式ページにまとめられています。

この中から、特に利用頻度が高そうなもの、実際にお世話になっているものをいくつか抜粋してみます。

Amazon EC2

750 時間というのは 24 で割ると 31.25 なので、 1 台の t2.micro インスタンスを無料で 1 ヶ月フル稼働させられるということになります。
毎日半日だけ起動するのであれば、 2 台分使えます。

ただしこれは起動時間に対する料金の無料枠なので、起動中に発生したデータ転送にかかるコストは別途必要になります。
また、期間は利用開始から 12 ヶ月間となっているので、初めて利用を開始したら 1 年間はがっつり使いましょう。

Amazon RDS

RDS に関しても利用開始から 12 ヶ月間、毎月 750 時間の無料枠が利用できます。また、データベースストレージについても 20 GB (汎用 SSD) の無料枠が利用できます。
ひとつ残念なのが、無料枠の対象となるインスタンスタイプ db.t2.micro が全てのデータベースエンジンに対応していないんですよね。というか、 Amazon Aurora のみ対応しておらず、それ以外は対応しています。

Amazon DynamoDB

DynamoDB は毎月上記の無料枠が付与されています。なので、ちょっと触る程度だったり、本当に小規模なサービスであればずっと無料で利用することができます。 (これは DynamoDB に限った話ではないですが)
読み/書き それぞれ 25 個のプロビジョニングキャパシティ25 GB のデータストレージ という値は個人で触る分には十分すぎる値で、私の場合は毎月少しずつストレージ容量は食ってますが、毎月 DynamoDB に対する料金は発生していません。(もちろん個人差はあります)
DynamoDB 使ってサーバレス開発ちょっとやってみたいけどコストが…と思っている方、十分な無料枠があるので安心してください。

AWS Lambda

Lambda は リクエスト回数コンピューティング時間 (秒) に対してコストが発生します。
リクエスト回数は、その名の通り Lambda 関数を実行した回数になります。毎月 1,000,000 回ってかなりの数ですよね。
最大 320 万秒のコンピュート時間についても、十分な利用枠だと思います。

Lamnda のコンピュート時間に対するコストは、 割り当てたメモリ実行時間 によって算出されます。ただしめちゃくちゃややこし良いので、詳細は Lambda の料金ページに記載されている例をご参照ください。

とは言っても、 Lambda に関しても個人で使う分には十分な無料枠なので、あまり神経質になる必要はないと思います。

Amazon SNS

AWS での各種通知は Amazon SNS を利用することが多いと思います。しかし、上記のように十分な無料枠が期間無制限で毎月利用可能なので、上で設定したコストアラート含め、さまざまな通知に対して利用してもほぼ無料枠で収まるのではないでしょうか。

AWS CodeCommit

CodeCommit に関してはだいぶ前にも書きましたが、個人で使うのであればほぼ無料で利用できるでしょう。無料枠からはみ出るとすれば、ストレージくらいな気がします。

AWS CodePipeline

たった 1 つのパイプラインだけかよと思われるかもしれませんが、この アクティブパイプライン というのがポイントです。

アクティブなパイプラインとは、30 日以上存在していて、その月に少なくとも 1 つのコード変更が発生したパイプラインです。その月に新しいコード変更がないパイプラインに対しては、料金は発生しません。アクティブなパイプラインは、1 か月に満たない分に対して按分計算されません

つまり、作成から 30 日以内のパイプラインであれば幾つ存在していても、かつ何回コードの変更があっても無料ということになります。
ありがちなパターンとしては、作成から 30 日以上経過しているもののほとんどコード変更のないパイプラインが複数あってもコストは発生しません。しかし、ある月にそれらのパイプラインのうち 2 つにコード変更が発生した場合、 1 つは無料枠の対象ですが、もう 1 つにはコストが発生してしまいます。

CodePiplie の料金は 1.00 USD/アクティブパイプライン なので、このパターンだと CodePipeline だけで 1 USD のコストが発生してしまいます。
自動デプロイはしたいけど節約もしたい… という場合は、できることは制限されますが CodeBuild だけでやるという方法もあります。

まとめ

AWS を個人で使う際にコストを削減する方法について書きました。
完全に無料で!というのは流石に難しいですが、無料枠の活用や Cost Explorer での見直しなどでコストの削減ができるのでは?という内容でした。コストの削減は個人レベルだけの話ではなく実際の業務においても重要な内容だと思うので、もしかしたら個人レベルで実施しているコスト対策が実務で生きる可能性もあります。

AWS は個人で使うにしては高い! という思いを持っている方には、そんなことないよと伝えたいです。


comments powered by Disqus