AWS Lambdaを1分間隔より短い間隔で定期実行させる
やりたいこと
タイトルの通りです。
AWS LambdaのトリガとしてCloudWatch Events Schedule を指定することで、Lambdaを定期実行することができます。
しかし、Unix系OSのCronと同様、1分間隔より短い間隔を指定することはできません。
Rate または Cron を使用したスケジュール式 - AWS Lambda
現状 CloudWatch Events Schedule によって1分間隔で起動させているLambdaを、10秒間隔、15秒間隔など秒単位で定期実行したい要件があり、実装方法を検討したのでその結果を残します。
Lambdaを定期的に起動するLambdaを導入してみた
1分毎に起動して、指定したLambdaを指定した間隔で起動し、1分後に終了するLambdaを作れば良いのでは、という案を思いつきました。 10秒間隔で Lambda を定期実行させる Lambda をNode.js v6.10 で素朴に作ってみました。
funcName に1分間隔より短い間隔で定期実行させたいLambdaの名前を指定します。 このLambda を CloudWatch Events Schedule で1分間隔で定期実行させることで、このソースコードの例では10秒間隔で指定したLambdaを定期実行することができます。
注意点
- funcName に指定した Lambda (10秒間隔で実行したいLambda)のトリガとしてCloudWatch Events Scheduleの定期実行設定が残っていると多重起動してしまうので、そちらのトリガは削除しておかないといけません
- この「10秒間隔で Lambda を定期実行させる Lambda」に割り当てるIAMロールへは、InvokeするLambda(10秒間隔で実行したいLambda)に対して lambda:InvokeFunction Actionを実行できる権限を付与しておく必要があります
- この「10秒間隔で Lambda を定期実行させる Lambda」のタイムアウト値は 60秒以上を設定する必要があります
...あれ?
できたはできたけど...
注意点の最後に挙げた項目が Lambda の、というかイベント駆動で動くFaaSの旨味を思いっきり消してしまっている気がします。 要するにこの「10秒間隔で Lambda を定期実行させる Lambda」は1分間起動し続けていなければならず、それもうEC2でも良くね?という気持ちが芽生えてきます。
実際にLambdaとEC2でそれぞれ1日中稼働させた場合のコストを比較すると、
Lambdaで運用
- メモリ割当 128MB、1回あたりの課金時間を 61,000ms(61秒)とする
- 実際には60,600ms くらいで終わることも多いのですが、ここでは多めに見積もります
- 1日の実行回数は 1440回
- 60(min) × 24(h)
- 毎月最初の 1,000,000 回は無料、かつ、それ以上実行しても $0.0000002 /回 という安価さなので計算から除外する
料金 - AWS Lambda(サーバーレスでコードを実行)|AWS
$0.000000208(/100 ミリ秒) × 610(100ミリ秒/回) × 1440(回) =$0.1827072
EC2で運用
- オンデマンド料金で算出する
- インスタンスタイプは一番小さい t2.nano、台数は1台とする
オンデマンドインスタンスの料金 - Amazon EC2 (仮想サーバー) | AWS
- 東京リージョンの場合
$0.0076(/1h) × 24(h) = $0.1824
- バージニアリージョンなどの場合
$ 0.0058(/1h) × 24(h) = $0.1392
結論
費用面だけ見ると、EC2(t2.nano)を常時起動していても対して変わらない、むしろ安い場合もある。という結果になりました。 しかし、EC2上で秒単位で起動するworkerを動かす場合と比較して、Lambdaで実行するのには以下のメリットがありそうです。
- 実装が簡単
- コケても次回(1分後)の実行に影響が出ないので一度軌道に乗れば運用は楽
- そもそもLambdaの実行のためにEC2を動かすのはなんかスッキリしない
逆に、何らかの用途ですでに常時起動しているEC2がいる場合はコストを考えて秒単位で起動するworkerを相乗りするのも手ですね。
・・・ひどく当たり前の結論になってしまいました。
秒単位でLambdaを定期実行したいときって、どうするのがスマートなのでしょうね??
Mackerelの公式プラグインをAWS Lambdaで実行してAmazon RDS for MySQL を監視する
Mackerelの公式プラグイン集や公式チェックプラグイン集は、各種ミドルウェアの詳細監視ができたり、AWS Integrationを使わなくてもRDSやELBなどのマネージドサービスのメトリック情報を取得することができたりと、大変便利なものです。
このプラグインはAWSのEC2など mackerel-agentがインストールできる環境からは簡単に使うことができるのですが、例えばAWS上に Web-アプリケーション-DB の3層アーキテクチャを構成している場合に、EC2がAutoScaling対象のWebサーバやアプリケーションサーバしかないことがあり、DB(RDS)を監視するのにこのプラグインをどのEC2から使うか、少々悩ましいことがあります。
- AutoScaling対象のEC2全てからプラグインを実行する場合
- チェックプラグインの場合、RDSに異常が発生するとAutoScaling対象のEC2の台数分(重複して)アラートが上がってしまう
- AutoScaling対象のEC2とは別に、RDS監視用のEC2を用意する場合
- 監視用EC2に障害が発生するとRDSの監視が止まってしまうので、冗長構成にするなど監視用EC2の可用性を高める工夫をしなければならない
- 監視用EC2自体の監視も必要になるため、Mackerel監視対象のホスト数が増えてしまう = コストが増えてしまう ことになる
そこで、この便利なプラグインをAWS Lambdaから定期的に実行できれば、安く*1、アラートも重複せず、安定してRDSなどのマネージドサービスを監視できるのでは、と考えました。
この記事では、MySQLのメトリックを取得する mackerel-plugin-mysql を使ってAmazon RDS for MySQL を監視する例をまとめます。
事前準備
AWSやMackerelのアカウントは取得済みとします。
またAWS上にすでにシステムは稼働しており、監視対象の RDS for MySQLの構築やその他セキュリティグループ等の設定は済んでいるものとします。
公式プラグインのバイナリを用意する
AWS Lambdaで実行できる形式のバイナリファイルを作成するため、一時的にEC2を立ち上げます。
まずはAWS公式サイトの情報を元に、AWS Lambdaの実行基盤となっているAmazon LinuxのAMIイメージを探します。
2017/10/15 時点だと amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2 です。
当該AMIを使ってEC2インスタンスを起動します。
起動したEC2にSSHでログインし、mackerel-agent, 公式プラグイン集 mackerel-agent-plugins をインストールします。
$ curl -fsSL https://mackerel.io/file/script/amznlinux/setup-all-yum.sh | MACKEREL_APIKEY='<YOUR API KEY>' sh $ sudo yum install mackerel-agent-plugins
Mackerelのプラグインが正しくインストールされたかを確認するため、手動でpluginのコマンドを実行してみます。
-host
オプションで指定するRDSのエンドポイントはAWSマネジメントコンソールのRDSのメニューから確認してください。
$ mackerel-plugin-mysql -host=sample-db.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -username=<USER_NAME> -password=<PASSWORD>
以下のように、{metric name}\t{metric value}\t{epoch seconds} (\t はタブ文字) の形式でたくさんの情報が標準出力に表示されれば成功です。
mysql.innodb_buffer_pool.pool_size 38208.000000 1507986274 mysql.innodb_buffer_pool.database_pages 2717.000000 1507986274 mysql.innodb_buffer_pool.free_pages 35484.000000 1507986274 mysql.innodb_buffer_pool.modified_pages 0.000000 1507986274 mysql.innodb_row_lock_waits.Innodb_row_lock_waits 0.000000 1507986274 mysql.innodb_adaptive_hash_index.hash_index_cells_total 1238989.000000 1507986274 (中略) mysql.innodb_semaphores.spin_waits 0.000000 1507986274 mysql.innodb_semaphores.spin_rounds 0.000000 1507986274 mysql.innodb_semaphores.os_waits 0.000000 1507986274
MackerelにRDS用のホストを登録し、メトリックを投稿する
先ほど立ち上げたAmazonLinuxのEC2に、Mackerel の CLIツールである mkr コマンドをインストールします。
$ sudo yum install mkr
Mackerelに監視対象のRDSをホストとして登録します。
以下の例ではホスト名をtest-RDS、Mackerel上のロール名を TEST:DB としてホストを作成しています。
$ mkr create test-RDS -R TEST:DB created SAMPLE12345
成功するとHostIDが表示されるので、これを控えておきます。
今回だと SAMPLE12345 です(実際には11文字のランダム文字列)。
Mackerelの画面でもホストとサービス・ロールが登録されていることが確認できます。
続いて今登録したホストのカスタムメトリックとしてRDS上のMySQLのメトリック情報を投稿します。
先ほど動作確認に使ったコマンドの結果をパイプで mkr throw
に渡してMackerelに投稿します。
$ mackerel-plugin-mysql -host=sample-db.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -username=<USER_NAME> -password=<PASSWORD> | mkr throw --host SAMPLE12345
以下のような結果が標準出力に表示されれば成功です。
thrown SAMPLE12345 'custom.mysql.join.Select_full_join 0.000000 1507987901' thrown SAMPLE12345 'custom.mysql.join.Select_full_range_join 0.000000 1507987901 ' thrown SAMPLE12345 'custom.mysql.join.Select_range 0.000000 1507987901' thrown SAMPLE12345 'custom.mysql.join.Select_range_check 0.000000 1507987901' (中略) thrown SAMPLE12345 'custom.mysql.innodb_buffer_pool_read.read_evicted 0.000000 15 07987901' thrown SAMPLE12345 'custom.mysql.innodb_buffer_pool_read.read_random_ahead 0.000000 15 07987901' thrown SAMPLE12345 'custom.mysql.innodb_checkpoint_age.uncheckpointed_bytes 0.000000 15 07987901'
Mackerel上で見てもメトリックが投稿されグラフが作成されていることがわかります。
ここまでの手順で作成したプラグインや mkrコマンドのバイナリファイルを、普段お使いの開発マシンなどにコピーしておきます。
このAmazonLinux EC2についてはLambda上で実行できる形式のバイナリファイルを作成するのが目的だったので、もう停止・削除してしまって構いません。
AWS Lambdaから実行できるようにする
今までの手順で作成した (Lambdaの実行基盤であるAmazonLinux 上でインストールして生成された) mackerel-plugin-mysql と mkr のバイナリファイルをLambdaのコードと一緒に固めてアップロードし、ハンドラ関数の中でそのバイナリファイルを実行するようなLambdaファンクションを作ります。それをCloudWatch Eventsで定期スケジュール実行すればよいことになります。
今回はCloudWatch EventsやIAM Role等の周辺設定を自動で行うため Serverless Framework (v1.23.0)を使って Node.js 6.10 のLambdaファンクションを実装しました。 Serverless Framework のインストール手順やサービス作成手順等は公式サイトやネット上に情報がありますので割愛します。
(任意のディレクトリ)/
├ .gitignore
├ bin/
│ ├ mackerel-plugin-mysql
│ └ mkr
├ handler.js
├ package.json
└ serverless.yml
- serverless.yml
service: sls-postCustomMetricToMackerel # 任意のサービス名 provider: name: aws runtime: nodejs6.10 region: ap-northeast-1 # 監視対象のRDSがあるリージョン functions: mackerel: handler: handler.postCustomMetricToMackerel name: ${self:service} events: - schedule: rate(1 minute) # CloudWatch Eventsで1分毎にスケジュール実行 environment: DBHOST: sample-db.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com # 監視対象のRDSのエンドポイント DBUSER: sampleuser # 監視対象のRDSの接続ユーザ名 DBPASS: S@mple # 接続ユーザのパスワード MACKEREL_HOSTID: SAMPLE12345 # 監視対象のRDSのMackerel上のHostID MACKEREL_APIKEY: # MackerelのAPI KEY vpc: securityGroupIds: - sg-xxxxxxxx # 監視対象のRDSにMySQL接続できるセキュリティグループを指定 subnetIds: - subnet-yyyyyyyy # 監視対象のRDSにMySQL接続できるサブネットを指定 - subnet-zzzzzzzz # 監視対象のRDSにMySQL接続できるサブネットを指定
簡単のため、DBの認証情報をそのまま環境変数に渡していますが、実運用上はKMSなどで暗号化して渡し、Lambdaの中で復号して使うのが良いでしょう。
- handler.js
'use strict'; const exec = require('child_process').exec; const dbhost = process.env.DBHOST; const dbuser = process.env.DBUSER; const dbpass = process.env.DBPASS; const mackerelhostid = process.env.MACKEREL_HOSTID; const mackerelApi = process.env.MACKEREL_APIKEY; const basedir = process.env.LAMBDA_TASK_ROOT; const cmd = `${basedir}/bin/mackerel-plugin-mysql -host=${dbhost} -username=${dbuser} -password=${dbpass} | MACKEREL_APIKEY=${mackerelApi} ${basedir}/bin/mkr throw --host ${mackerelhostid}`; module.exports.postCustomMetricToMackerel = (event, context, callback) => { let child = exec(cmd, function(err, stdout, stderr){ if (!err) { console.log('standard out: ' + stdout); console.log('standard error: ' + stderr); callback(null, 'Success!'); } else { console.log("error code: " + err.code + "err: " + err); callback(err); } }); };
sls deploy
コマンドでデプロイすると、LambdaファンクションとそのトリガとなるCloudWatch Events、Lambdaファンクションに割り当てるIAM Roleが作成されます。
AWS Lambdaのコンソールからテスト実行して成功すれば、あとは放っておくだけで1分毎に RDS for MySQL のメトリック情報がMackerelに投稿されます。
まとめ
Mackerelの公式プラグインをAWS Lambdaで定期実行する仕組みを試作しました。これにより、監視専用のEC2インスタンスを立ち上げることなくRDSなどのマネージドサービスの監視を行うことができました。
ただし、実運用に投入する際はCloudWatch AlarmなどでこのLambdaファンクションが正常に実行されているかなどを監視する必要があります。
Mackerel Day #mackerelday に参加してきました
昨日(もう一昨日になっちゃった)開催されたMackerel Dayに参加してきました。
とても有意義で楽しいイベントだったので、手元のメモをここに残します。 スピーカーの方の本名を書いて良いものなのかどうかわからなかったので、Connpassページにお名前が記載されている方のみお名前も書いています。
Mackerelリリース3周年の振り返りとこれからの成長について
Mackerel プロデューサー 杉山 id:sugiyama88 さん
- 現在166週連続リリース中
- 直近の主要なリリース
Mackerelは構成管理系の機能が拡充してきていて、もはや監視ツールというよりは動的に変化するシステムにリアルタイムに追従できる「現状把握」の「プラットフォーム」になってきているな、と感じました。
アプリケーションエンジニアがMackerelで楽しく監視構成している事例
- DMM.com ラボ
- id:koudenpa さん
- id:heleeen さん
www.slideshare.net
- 導入背景
- 最初はCloudWatch + Lambda → Slack通知 でやっていた
- 導入にあたり、自分たちが運用するにあたっての利便性 を観点にいくつかのツールを比較検討した
- 監視構成
- 監視設定の管理
- Jenkinsから
mkr monitor push
- 設定のJSONはGit管理
- チャンネル設定は手作業
- Jenkinsから
- 得られた価値
- 楽 である
- 想定通りに平易に監視を構成できた
- つまづくところがほぼなし
- 楽しく 監視構成
- 何をすればどうなるかがわかりやすい
- やってみて反映されるまでが早い
- 通知時のグラフでぱっとヤバさがわかる
- アプリケーションエンジニアでも異常がわかる
- 楽 である
- まとめ
- 導入が楽で運用が楽しい
- 監視結果を受けての改善サイクルができつつある
アプリケーション開発者の視点から見た監視や監視ツールについてのお話でした。会場アンケートではインフラエンジニアとアプリエンジニアの比率が6:4から7:3くらいだったかと思いますが、ずっとインフラをやってた身からすると「今はこんなにアプリケーション開発者がインフラ監視もしてるのか!」とちょっと驚きでした。
Mackerel インフラ基盤 AWS 移行の舞台裏
- 8/7,21 にMackerelの基盤はAWSに移行した
- なぜAWSに移行したか
- 時系列データベース
- ハードウェア的スケールの限界、調達が大変だった
- データの堅牢性、冗長性の向上を図りたかった
- データセンター運用コストの削減
- ハードウェア、リソース管理の人的コストを下げたかった
- 時系列データベース
時系列データベースの移行
- データセンターで動いているものとAWSで動いているものは別
- AWSで動いているものは自分たちで作り直した
- AWS Summit2017で id:y_uuki さんが発表している blog.yuuk.io
時系列データベースの運用
- 権威DNSはデータセンターのものを使っている
- 社内システムを利用する必要があるため
- ホストのローカルキャッシュサーバに Unboundを使っている
- MackerelホストのunboundはGoogle Public DNSを見ている
- AWSのネットワークモニタリング
- Q & A
単純な「オンプレミスからAWSへの移行」事例としてもすごい話だと思うんですが、その上AWSの各マネージドサービスの特性をフルに活かした構成に再構築されているのが凄まじいです。
コストについてはオンプレミスとクラウドで単純比較は難しいですね。AWSでいうMulti-AZはオンプレミスでいえば2か所以上のデータセンタをつないで運用していることになるので、それと比較すれば安いと思われるのですが。
大丈夫! Mackerel には CRE がいます
- CREとは
- Customer Reliability Engineer
- 顧客信頼性エンジニア
- CREがMackerelチームに在籍していることの意味
- Mackerelによってユーザに提供されているものはなにか
- 例えば
- サーバ監視が効率化される
- 動的なインフラ管理を実現することでDevOpsが加速される
- こうした価値はMackerelが利用されることで初めて生まれるもの
- ユーザが居るからこそMackerelの価値はうまれる
- 例えば
- Mackerelの価値を支えるもの
- プロダクトそのもの
- はてなのエンジニアの高い技術力によって支えられている
- Mackerelに対するエンジニアの皆様からの信頼
- 投げかけた質問に的確かつ真摯な回答が得られること
- わかりやすく正確なドキュメントがあること
- Mackerelについてまだ知らない方がそれを使うことの便利さや重要性などを短期間で把握できること
- プロダクトそのもの
- これらの側面でMackerelに対する信頼性を支えるエンジニアロールがCRE
- 開発エンジニアとのやりとりも積極的に円滑に行うことで、迅速なレスポンスの維持に努める
- 同営業日中 90%
- 翌営業日までに 99%
- やりとりの往復 2往復以内
- を達成 (前期実績)
- 公式ヘルプページなどドキュメントもGitHubレポジトリで管理(Privateレポジトリ)
- 「CREがいること」も含めてMackerelというサービス
サポートのレスポンスの速さと正確さは本当に驚異的で、これは当然CREのお二方のサポートが卓越しているからだと思うのですが、それだけでなくユーザ側もリテラシーや説明能力が高い人が多いというのもあるのでは、とイベントに参加して周りの方を見ていて感じました。
サービス提供側も利用側もハイレベルですごい世界だなと思います。
freeeでMackerelを使って一年間サービスを運用してみた事例紹介
- freee 浅羽さん
- Mackerel導入前はZabbixを使っていた
- VPC毎にZabbixサーバを運用
- いくつかのプロダクトを評価
- 監視の構成
- 通常時
- ダッシュボードかサービス一覧のグラフを眺める
- 定期的にパフォーマンス振り返り会を実施
- 手でポチポチ作るのは面倒なのでmkrコマンドで作る
- さらに深掘りしたいときはNewrelicで確認する
- ダッシュボードかサービス一覧のグラフを眺める
- 何かあった時やグラフをシェアしたい時
- チャンネルにグラフを投稿 が超絶便利
- いつデプロイしたかわかるように記録しておく
- グラフアノテーションを自動化
- EC2起動時の初期状態はStandby
- 初期ビルドがおわったら mkr を叩いてworkingに戻す
- 構築がコケた場合も mkr を叩いてworkingに戻す → コケたことを検知できる
- Mackerelに欲しい機能
- AWSインテグレーションも自動退役機能欲しい
EC2起動時の初期状態をStandbyにしておく、というのが目からウロコでした。AutoScalingでEC2が起動するたびチェック監視に引っかかってたので、早速うちの環境でも取り入れました。
グラフの共有機能でいうと自分はMarkdown形式で共有できるのが気に入っていて、Github/GitLab や Crowi などのMarkdownをレンダリングしてくれるWebサービスに張り付けて自作ダッシュボードを作って眺めてます。これだとFreeプランでもダッシュボード作り放題だし複数オーガニゼーションのグラフを並べられて便利!
Mackerelを導入して変わったN個のこと
- GMO ペパボ 高石 諒 さん
- 初めて触った監視ツールがMackerel
- 2015年4月に正式導入
- 2017年10月5日時点でホスト数1000台
- サービス 20
- ユーザ 100
- ロール 300
- ホスト 1000
- サービスメトリック 300
- 外形監視 70
- Mackerel導入前の課題
- Mackerel実践活用 @ペパボ
- いろんな言語で手軽に独自プラグインがかけるのは楽しい!
- Q & A
- 運用ツールとしてMackerelのグラフを活用しているということだが、面白い使い方しているものはあるか
- 各種クラウドサービスの料金とか、金の相場とか ravelll.hatenadiary.jp
- 運用ツールとしてMackerelのグラフを活用しているということだが、面白い使い方しているものはあるか
リリースにかかった時間を計測している、というのが面白いなと思いました。デプロイプロセスを改善する際に定量的な評価ができるので素敵ですね。
懇親会でオーガニゼーションの構成についてお話を伺ったところ、あれだけジャンルの違う様々なサービスを展開されているのにMackerelのオーガニゼーションは1つだけで、全社員が全サービスの状況を自由に確認できるようになっているとのことでした。すごいなぁ!
Driving Mercari with 50+ custom Plugins
- 株式会社メルカリ 長野 id:kazeburo さん
- Mackerelの導入理由
- 異なるインフラの監視項目・内容を共通化する
- 以前はリージョン毎にZabbixを利用。バージョンがズレたり監視内容の差が発生
- Service/Roleを利用することで管理
- 異なるインフラの監視項目・内容を共通化する
- Mackrel以外の監視
- Kurado
- グラフを一気に見られる
- 基本的なメトリクスはこちらで見る
- New Relic
- PHP内部のトレース
- Kurado
- Service/Role設計&Deploy
- サービスを行うリージョン毎にServiceを分ける
- mercari, mercari-us, mercari-gb
- 外形監視は別Service
- mercari0jp-extenalなど
- 通知チャンネルを分けるため
- Role名のprefixに意味を持たせる
- サービスを行うリージョン毎にServiceを分ける
- Deploy
- Mackerelによる監視とPlugin
- 紹介されていたカスタムプラグインのうち特に気になったもの
- diff-detector
- コマンドの結果に変化があるとアラート
cat /etc/passwd
,uname -a
とか
- mackerel-plugin-ntpq
- check-ntp ではなくメトリックで見ているのは、時刻のズレ方を見たいから
- periodic-checker
- 特定の時間のみ監視を行う
- diff-detector
- 監視されてないサーバの自動検知
- 1日2回Slackに通知
ものすごい情報量の発表で圧倒されました。
特定の時間だけ監視を行う、もしくは監視を止める 機能はmackerel-agent標準に欲しいと思いました。夜間休日停止させている開発・管理系のEC2の監視設定をもう少しスマートにやりたい。
AWS Ecosystem with Mackerel
- AWS 酒徳 さん
- DevOps系サービス
- 色々あるけど、CodeStarで割りと統合されてる
- が、東京リージョンにはまだ来てない
- CloudFormation がマルチアカウント・マルチリージョンに対応した
- 色々あるけど、CodeStarで割りと統合されてる
- This is my Architecture
- https://aws.amazon.com/jp/this-is-my-architecture/
- いろんなサービスがAWS上にどう構築されているかを語る動画が数十本掲載されている
AWSの繁栄はエコシステムあってのこと、というお話でした。AWSから見てもMackerelは単なる監視ツールではなくDevOpsを加速させるためのプラットフォームという認識なんですね。
参加しての感想
いろいろな環境での事例を聞けて、早速うちの環境でも適用できそうな知見も多く、さらに懇親会では直接はてなのエンジニアみなさんとお話しでき、要望をお伝えしたり今後の展望を伺えたりしてとても楽しかったです。 企画・運営してくださったはてなの皆様、ありがとうございました。
イベント自体がとても楽しかった上、お酒も入ってテンション上がってしまって「インフラの運用ってなんだかんだ楽しいですよねー?」って懇親会で色んな人に絡んでしまってちょっと反省している。
— MIYA (@kmiya_bbm) 2017年10月5日
でも楽しいよね?
AWSアカウントを作ったらまずはこれをやる
業務・個人利用を問わず、新規にAWSアカウントを取得する機会が増えたので、普段自分がやっていることをまとめてみる。
セキュリティ系
- rootアカウントを多要素認証(MFA)有効化した上で闇に葬る
- 絶対にrootアカウントのアクセスキーは作成しないこと
- ただし、rootアカウントでないとできないことも結構あるので、完全にはつぶせない
- IAMアカウント用パスワードポリシーを設定する
- IAMアカウントを作る or Switch role 用のIAMロールを作る
- いずれにせよ MFA必須
予算管理系
- CloudWatchで請求金額のアラートを設定する
- Cost Explolerを有効化する
- Budgetを設定する
- 現地通貨設定する
監査系
- 全リージョンでCloudTrailを有効化する
- 全リージョンでAWS Configを有効化する
- 以前はAWS Config Rulesの"cloudtrail-enabled"ルールで各リージョンのCloudTrailが有効になっているかチェックしていたが、費用が高い(月額 $2/Rule)ため自前Lambdaファンクションを書いた
- (ビジネスプラン以上のサポートに加入している場合は) AWS Trusted Advisor チェックを実施する
あと何かあったかな?