参考 CloudWatch:課金情報の取得

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が課金合計です。
集計方法はおまかせします。。

Comments