こんにちは。普段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 にチェックを入れます。

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

ここで、料金情報を見ることができますが、この情報を取得します。
Access Key IdとSecret Access Keyを取得
CloudWatch APIを利用するために IAMなどでユーザを作り、Access Key IdとSecret Access Keyを取得しておきます。ここは詳しく説明しません。
SDKのダウンロード
AWS SDK for iOSより、SDKをダウンロードします。ちなみに、同ページにReferenceもあります。
コード
非常にシンプルなコードをサンプルとして書きました。ViewControllerが1つで、直近の料金を取得してログを吐くだけのコードです。サンプルをGitHubにあげておきました。
# 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を利用している人はかなり少ないのかもしれない。などと思いました。ただ、最初の一歩のハードルが高いだけだとしたら、今回の僕の記事で誰かが最初の一歩を超えるお手伝いができればと思い、公開してみました。