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

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にチェックを入れます。

Pref

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

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を利用している人はかなり少ないのかもしれない。などと思いました。ただ、最初の一歩のハードルが高いだけだとしたら、今回の僕の記事で誰かが最初の一歩を超えるお手伝いができればと思い、公開してみました。

サンプルコード

参加したハッカソン

Pocket
LINEで送る

You may also like...