月: 2021年7月
AWS Instance Schedulerによってできること
Amazon EC2および RDSインスタンスの開始スケジュールと停止スケジュールを設定して、AWS リソースコストを管理することができます。 また、使用されていないリソースを停止し、キャパシティーが必要なときにリソースを開始することで、運用コストを削減するのに役立ちます。例えば、企業は本稼働環境で AWS Instance Scheduler を使用して、毎日営業時間外にインスタンスを自動的に停止できます。現在すべてのインスタンスを完全に使用したままにしている場合、このソリューションによってインスタンスの使用率が低下し、設定されたスケジュールに基づいて全体的なコストが削減される可能性があります。 簡単にまとめると会社の業務時間内(9:00~18:00)のみインスタンスを稼働させ業務時間外はインスタンスを止め費用の削減をすることができ、起動と停止の作業をを自動でやってくれます !
上記の構成図の通り、Instance SchedulerはAWSが提供するサービスそのものではなく各サービスの組み合わせでの総称なため使ったことのない人も多いと思いますがコストを削減していく上でかなり重要なサービスです。ただし、注意してもらいたいのがCloudformationで作成したLamdbaなどのサービスコストが月に$5ほどかかります。
こちらの構成図を1から作るのはかなり面倒ですがすでに公式でCloudformationのテンプレートが用意されているので簡単に作成することができます!!
Instance Schedulerの設定手順
1. Cloudformationの設定
- 下記のurlを開き画面右側にある ”awsコンソールで起動する” を押す
※最初はバージニアリージョンになるので正しいリージョンへ変更する
これでcloudformationの設定は完了です。CloudFormation によって、 下記のResourcesが作成されます。
・Lambda
・DynamoDB
・IAM Policy
・EventBridge Rule
・KMS
・SNS
2. スケジュールの設定
コンソール画面からDynamodbのページへ行きます。cloudformationの設定がうまく出来ていれば3つのテーブルが作成されているはずです。スケジュールの設定はDynamodbのテーブルからできます。
instance-scheduler-ConfigTableを開き
①Instance−scheduler−ConfigTableを選択
②name: office-hoursを選択->アクション->編集
③name: uk-office-hoursを選択-> アクション-> コピー
これでスケジュールの設定は以上です。あとは裏でLambdaがいい感じに対応してくれます!
3.インスタンスにタグ付け
あとはインスタンス(EC2,RDS)に 特定の Tag をつけるだけです。Tagをもとに自動起動・停止が動作します。
まとめ
かなり駆け足でしたが簡単にAWS Instamce Schedulerの使い方について説明しました。 Instamce Schedulerは今回説明した機能だけではなくインスタンスサイズのアップグレードの変更などもできます。 開発環境やStaging環境のコスト削減していくにはおすすめなサービスだと思います。 参考 https://d1.awsstatic.com/Solutions/ja_JP/instance-scheduler.pdfDynamodb上のデータをグラフ化するにはBIツールであるAmazon QuickSightやElasticsearchなどのサービスがあります。しかし、Amazon QuickSightでグラフ化するにはLambdaを使ってDynamoDBのデータをCSVに変換しS3に格納したりする必要があるため面倒です。なので今回はcloudwatchを使ってデータをグラフ化(可視化)したいと思います。

設定手順
①Dynamodbテーブルの作成
今回はデバイスの温度を管理するテーブルを作成し、データをグラフ化したいと思います。
- テーブル名: SensorTable
- プライマリキー: SensorID 数値型
- ソートキー: Time 文字列型

作成したSensorTableにデータを入れます。

■Dynamodb Streamの有効化
Dynamodb StreamとはDynamoDBに対する項目の追加、変更、削除をイベントとして検出できる機能です。
テーブルで DynamoDB Streams を有効にした場合、書き込む AWS Lambda 関数にストリーミングの Amazon リソースネーム (ARN) を関連付けることができます。テーブルの項目が変更されると、新しいレコードがテーブルのストリーミングに直ちに表示されます。AWS Lambda はストリーミングをポーリングし、新しいストリーミングレコードを検出したときに Lambda 関数を同期的にコールします。
公式より引用

②Lambdaの作成
- 関数名(今回はput_cloudwatch)
- ランタイム Python 3.8
画像4

これでLambda関数が作成されたと思います。関数を作成すると自動でロールが作成されます。しかし、このロールはCloudwatch logsの権限しかついていないためポリシーをつけ加えます。

下記2つのポリシーをアタッチする
- CloudWatchFullAccess
- AWSLambdaDynamoDBExecutionRole

トリガーの追加


最後にソースコードをDeployすればDynamodbをトリガーとするLamabda関数の完成です。
import json
import boto3
cloudwatch = boto3.client('cloudwatch')
def lambda_handler(event, context):
SensorID = event['Records'][0]['dynamodb']['Keys']['SensorID']['N']
Temperature = event['Records'][0]['dynamodb']['NewImage']['Temperature']['N']
# print(Temperature)
# print(SensorID)
try:
cloudwatch.put_metric_data(
MetricData = [
{
'MetricName': 'SensorTable',
'Dimensions': [
{
'Name': 'SensorID',
'Value': f'SensorID-{int(SensorID)}'
},
],
'Unit': 'Count',
'Value': int(Temperature)
},
],
Namespace = 'SensorTable'
)
except Exception as e:
print('Error: Dynamodb error', e)
print(e)

SensorTableにテーブルにデータを入れるとcloudwatchカスタムメトリクスが作成されているはずです。エラーが出た場合はCloudwatch logsを確認してみてください。

■まとめ
今回はDynomodb上のデータをcloudwatchを利用してグラフを作成しました。cloudwatchで作成したことによりアラームの作成やほかサービスとの連携が簡単にできると思います。しかし、cloudwatchの料金は意外と高いため注意が必要です!
参考
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Streams.Lambda.Tutorial.html
cloudwatchの料金
https://aws.amazon.com/jp/cloudwatch/pricing/?nc1=h_ls
