1,IAM
---------------------------------------
AWSサービス:Amazon CloudWatch
アクション :GetMetricStatistics と ListMetrics
Amazonリソースネーム(ARN):*
---------------------------------------
2,プログラム仕様
●入力パラメータ
・IAMユーザの”アクセスキーID”と”・シークレットアクセスキー”
●処理内容
課金情報を取得しDataGridViewへ表示する
●エラー処理
特になし
3,画面構成
4,プログラム
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim _AWSID As String = TextBox1.Text
Dim _AWSPass As String = TextBox2.Text
'結果表示用のDataTableの定義
Dim Dt As New DataTable
Dt.Columns.Add("LinkedAccount")
Dt.Columns.Add("ServiceName")
Dt.Columns.Add("Currency")
Dt.Columns.Add("MaxValue")
Dt.Columns.Add("TimeStamp", Type.GetType("System.DateTime"))
Dim cred As Amazon.Runtime.BasicAWSCredentials
cred = New Amazon.Runtime.BasicAWSCredentials(_AWSID, _AWSPass)
Dim CwClient As Amazon.CloudWatch.AmazonCloudWatchClient
CwClient = New Amazon.CloudWatch.AmazonCloudWatchClient(cred, Amazon.RegionEndpoint.USEast1)
Dim reQ As Amazon.CloudWatch.Model.ListMetricsRequest
reQ = New Amazon.CloudWatch.Model.ListMetricsRequest
reQ.MetricName = "EstimatedCharges"
Dim Res As Amazon.CloudWatch.Model.ListMetricsResponse
Res = CwClient.ListMetrics(reQ)
For Each wMetric As Amazon.CloudWatch.Model.Metric In Res.Metrics
Dim reQ_stats As New Amazon.CloudWatch.Model.GetMetricStatisticsRequest
reQ_stats.Dimensions = wMetric.Dimensions
reQ_stats.MetricName = wMetric.MetricName
reQ_stats.Namespace = wMetric.Namespace
'期間:昨日から今日まで
reQ_stats.StartTime = DateAdd(DateInterval.Day, -1, Date.UtcNow)
reQ_stats.EndTime = Date.UtcNow
'間隔:1日
reQ_stats.Period = 60 * 60 * 24
reQ_stats.Statistics.Add("Maximum")
Dim Res_stats As Amazon.CloudWatch.Model.GetMetricStatisticsResponse
Res_stats = CwClient.GetMetricStatistics(reQ_stats)
Dim wServiceName As String = ""
Dim wCurrency As String = ""
Dim wLinkedAccount As String = ""
For Each wDimension As Amazon.CloudWatch.Model.Dimension In wMetric.Dimensions
Select Case wDimension.Name
Case "LinkedAccount" : wLinkedAccount = wDimension.Value
Case "ServiceName" : wServiceName = wDimension.Value
Case "Currency" : wCurrency = wDimension.Value
End Select
Next
For Each wDataPoint As Amazon.CloudWatch.Model.Datapoint In Res_stats.Datapoints
Dim dR As DataRow = Dt.NewRow
dR("LinkedAccount") = wLinkedAccount
dR("ServiceName") = wServiceName
dR("Currency") = wCurrency
dR("MaxValue") = wDataPoint.Maximum
dR("TimeStamp") = wDataPoint.Timestamp
Dt.Rows.Add(dR)
Next
Next
'画面表示
DataGridView1.DataSource = dt
End Sub
|
5,解説
5-11行目:取得できるデータ項目です。
LinkedAccount: AWSアカウントが設定されます。AWSの一括請求に対応したものです。
こちら参照。
親請求アカウントには空白が設定されます
ServiceName:AmazonEC2・AmazonS3等が設定されます。合計行には空白が設定されます。
Currency:現時点では”USD”のみ設定されています。近い将来JPY等が設定されるんでしょう。
MaxValue:課金額が設定されます。
TimeStamp:取得日時?だと思います。範囲指定方法によって意味合いが違うのかも。今回のプログラムでは実行時刻が設定されています。
14-17行目:CloudWatchクライアントを作成します。
課金情報は、リージョンUSEast1 でないと取得できません
21行目:リクエストオブジェクトパラメータ設定
MetricNameには”EstimatedCharges”を設定します。おまじないです
23-24行目:ListMetricsで得られる結果
23
24
| Dim Res As Amazon.CloudWatch.Model.ListMetricsResponse
Res = CwClient.ListMetrics(reQ)
|
デバッグしてみると・・・
Metrics配列から、それぞれの格納値を抽出します。26行目でループ開始
ループ中のwMetric変数には、下図のような値が設定されています。
前後しますが・・・
42-51行目で、Name/Valueの配列を、列名/値 に変換します。
42
43
44
45
46
47
48
49
50
51
| Dim wServiceName As String = ""
Dim wCurrency As String = ""
Dim wLinkedAccount As String = ""
For Each wDimension As Amazon.CloudWatch.Model.Dimension In wMetric.Dimensions
Select Case wDimension.Name
Case "LinkedAccount" : wLinkedAccount = wDimension.Value
Case "ServiceName" : wServiceName = wDimension.Value
Case "Currency" : wCurrency = wDimension.Value
End Select
Next
|
27-37行目:GetMetricStatisticsを実行するためのパラメータ設定
Dimensions ← wMetric.Dimensionsをそのまま設定
MetricName ← ”EstimatedCharges” 上記抽出条件なので事実上固定値になります。
Namesspace ← ”AWS/Billing
”が設定されることになります。これも事実上の固定値ですStartTime ← 現在時刻(UTC)から1日前を設定
EndTime ←現在時刻(UTC)を設定
Period ←データ取得期間(間隔?) 60秒×60分×24時間 つまり1日
Statistics ←取得する値 Maximum
ちなみに・・・
※StartTimeをもう少し前。例えば3日前に設定すると、3日前までの課金状況が取得できます。
※Periodの間隔を短くすると。例えば6時間単位とすると、小刻みに課金情報が取得できます。
(ただし、AWSの集計間隔はリアルタイムではありません)
期間と間隔を変更すると、結果値の集計方法も合わせて検討する必要があります。
27
28
29
30
31
32
33
34
35
36
37
| Dim reQ_stats As New Amazon.CloudWatch.Model.GetMetricStatisticsRequest
reQ_stats.Dimensions = wMetric.Dimensions
reQ_stats.MetricName = wMetric.MetricName
reQ_stats.Namespace = wMetric.Namespace
'期間:昨日から今日まで
reQ_stats.StartTime = DateAdd(DateInterval.Day, -1, Date.UtcNow)
reQ_stats.EndTime = Date.UtcNow
'間隔:1日
reQ_stats.Period = 60 * 60 * 24
reQ_stats.Statistics.Add("Maximum")
|
39-40行目:GetMetricStatisticsを実行し、詳細データを取得します。42-51行目:前述LinkedAccount/ServiceName/Currencyを設定します。
53-61行目:GetMetricStatisticsの取得結果からDatapoints内のMaxmumとTimeStampを取得し、DataTableへセットしますデバッグすると↓こんな感じです。

53
54
55
56
57
58
59
60
61
| For Each wDataPoint As Amazon.CloudWatch.Model.Datapoint In Res_stats.Datapoints
Dim dR As DataRow = Dt.NewRow
dR("LinkedAccount") = wLinkedAccount
dR("ServiceName") = wServiceName
dR("Currency") = wCurrency
dR("MaxValue") = wDataPoint.Maximum
dR("TimeStamp") = wDataPoint.Timestamp
Dt.Rows.Add(dR)
Next
|
実行結果
LinkedAccount =空白 でServiceName=空白 でTimeStampが最新の行のMaxValueが課金合計です。
集計方法はおまかせします。。