iOSから直接AWSのCloudWatch APIを叩いて利用料金データを取得してみたよ


こんにちは。普段iOSの開発しています。AWSは憧れです。そんな状態で、AWSのAPIを利用するハッカソンに参加して奮闘しました！とりあえず、サーバサイドの言語はまだ弱いので、iOSから直接APIを叩いてしまえ、SDKもあるしな！気になるのは料金だ。シンプルに料金を取得して表示するのだということで、 **Cloudwatch** というAWSの利用料金を取得できるAPIをいじってみようと思いました。

SDKはある。ドキュメントもある。ただ、実装例が見つけられない。Googleさんに聞いてもヒットしない。GithubでもAWSのSDKを導入したiOSのプロジェクトはあるものの、Cloudwatchを利用した例が見つけられませんでした。

AWSの方にも助けていただき、なんとかデータを取得することができたので記録しておきます。

## Cloudwatchを利用する準備

AWSコンソールの **My Account > Preferences** を開き、下記、 **Receive Billing Alerts** にチェックを入れます。

<img style="display:block; margin-left:auto; margin-right:auto;" src="http://blog.morizotter.com/wp-content/uploads/2014/07/morizotter_blogpref.png" alt="Pref" title="pref.png" border="0" width="600" height="238" />

すると、CloudWatchを開いた時に、 **Billing** という項目が表示されます。

<img style="display:block; margin-left:auto; margin-right:auto;" src="http://blog.morizotter.com/wp-content/uploads/2014/07/morizotter_blogbilling.png" alt="Billing" title="billing.png" border="0" width="189" height="254" />

ここで、料金情報を見ることができますが、この情報を取得します。

## Access Key IdとSecret Access Keyを取得

CloudWatch APIを利用するために IAMなどでユーザを作り、Access Key IdとSecret Access Keyを取得しておきます。ここは詳しく説明しません。

## SDKのダウンロード

[AWS SDK for iOS](http://aws.amazon.com/jp/sdkforios/)より、SDKをダウンロードします。ちなみに、同ページに[Reference](http://docs.aws.amazon.com/AWSiOSSDK/latest/)もあります。

## コード

非常にシンプルなコードをサンプルとして書きました。ViewControllerが1つで、直近の料金を取得してログを吐くだけのコードです。サンプルを[GitHub](https://github.com/morizotter/AWSCloudWatchSample)にあげておきました。

```objc
#import "ACSViewController.h"
#import <AWSCloudWatch/AWSCloudWatch.h>

@interface ACSViewController ()

@end

@implementation ACSViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    
    [self getData];
}

- (void)getData
{
    AmazonCloudWatchClient *client =
    [[AmazonCloudWatchClient alloc] initWithAccessKey:@"YOUR_ACCESS_KEY_ID"
                                        withSecretKey:@"YOUR_SECRET_ACCESS_KEY"];
    
    CloudWatchDimension *dimension = [[CloudWatchDimension alloc] init];
    dimension.name = @"Currency";
    dimension.value = @"USD";
    NSDate *startDate = [NSDate dateWithTimeInterval:-60 * 60 * 24 sinceDate:[NSDate date]];
    NSDate *endDate = [NSDate date];
    
    CloudWatchGetMetricStatisticsRequest *request = [[CloudWatchGetMetricStatisticsRequest alloc] init];
    request.metricName = @"EstimatedCharges";
    request.namespace = @"AWS/Billing";
    request.statistics = @[@"Sum", @"Average", @"Minimum", @"Maximum"].mutableCopy;
    request.startTime = startDate;
    request.endTime = endDate;
    request.period = @60;
    [request addDimension:dimension];
    
    CloudWatchGetMetricStatisticsResponse *response = [client getMetricStatistics:request];
    
    if (response.error) {
        NSLog(@"error: %@", response.error);
        return;
    }
    
    NSLog(@"label: %@\ndata points: %@", response.label, response.datapoints);
}

@end
```

簡単に解説をします。まず、 **aws-ios-sdk-1.7.1** から、 **AWSRuntime.framework** と、 **AWSCloudWatch.framework** をプロジェクトに追加します(CocoaPodsにもありますが、動かなかったので、直接追加しました)。ViewControllerでは、AWSCloudWatchのみインポートします。

**YOUR_ACCESS_KEY_ID** と 、 **YOUR_SECRET_ACCESS_KEY** には、AWSで作成したユーザの情報を入力します。そのままの状態でGitHubなどで公開すると勝手に使われてしまったりすることもあるようなので、ご注意下さい。

あとは上記のコードを書くだけです。直近の支払状況をおおまかに取得することができます。responseのdatapointsは、 **CloudWatchDatapoint** というクラスのインスタンスが渡ってきます。dimensionの指定の仕方がわからなかったのと、ちょっと指定を間違えたり必須のプロパティ指定が欠けると落ちるのですが、どれがひっすかわからず、また、エラー文言が空文字だったので、簡単そうに見えるかもしれませんが、ハマリました。。

とりあえず、上記のコードを実行すればアクセスはできるので、あとは、触りながらもう少し希望に近い形で取得できるようにしたいなと思っています。

## 後記

AWSのCloudWatch APIを利用しているコードを探そうと、 **CloudWatchGetMetricStatisticsRequest** などのキーワードで検索しても、サンプルや試行錯誤の様子がネット上で見当たりませんでした。GitHubでコード検索しても、SDKの上記クラスはヒットするのですが、実装例は見当たりませんでした。もしかしたら、iOSでCloudWatchを利用している人はかなり少ないのかもしれない。などと思いました。ただ、最初の一歩のハードルが高いだけだとしたら、今回の僕の記事で誰かが最初の一歩を超えるお手伝いができればと思い、公開してみました。

## サンプルコード

- [morizotter/AWSCloudWatchSample](https://github.com/morizotter/AWSCloudWatchSample)

## 参加したハッカソン

- [第二回アカツキハッカソン部主催ハッカソン 「クリエイティブ * AWS => 業務を楽しく！」 賞金総額20万円 ( HackCamp監修ハッカーグッズ ) - アカツキハッカソン部 | Doorkeeper](http://akatsuki.doorkeeper.jp/events/12439)