AWS Lambda で Javaを使う ー実装編 - CloudWatchの引数を確認する


やりたいこと

Lambdaで実行するJavaで、CloudWatchに登録してある引数を取得する。

背景・経緯

前回の記事で作成したEC2の起動停止するLambdaファンクションを、
CloudWatchEventsのCronで、8時、9時、17時、18時など複数の時間帯で起動するようにしていた。
が、どのインスタンスをどの時間に起動するようにしたか忘れてしまい、
いちいちCloudWatchEventsに登録した引数を確認しなければならなかった。
面倒だったので、引数を取得するファンクションを作成した。
(メモを取ると、登録している引数とメモを同期させないといけないので、避けたかった。)

AWS Lambda で Javaを使う 目次

Eclipse準備編
・登録実行編(いつか)
実装編 - EC2を止める/立ち上げる
実装編 - CloudWatchの引数を確認する
実装編Tips - ReagionとInstanceIDからInstance名を取得する

とりあえずクラス作成

前回と同じ

CloudWatchEventsをごにょごにょする

CloudWatchEventsオブジェクトを作成する

// CloudWatchEventsオブジェクトを作成
AmazonCloudWatchEvents event = AmazonCloudWatchEventsClientBuilder.defaultClient();

CloudWatchEventsのルールを取得する

ListRulesResult retRule = event.listRules(new ListRulesRequest());
for(Rule rule : retRule.getRules()) {
    // rule.getName()、rule.getDescription()
}

コンソールでいうところのこの部分
メソッド名通り、ルールの名前と説明を取得できる。

CloudWatchEventsのルールからターゲットを取得する

// get target information from rule
ListTargetsByRuleRequest req = new ListTargetsByRuleRequest().withRule(rule.getName());
ListTargetsByRuleResult retTarget = event.listTargetsByRule(req);
List<Target> cloudWatchTargets = retTarget.getTargets();

for (Target target : cloudWatchTargets) {
    //  do loop each cloud watch rule's target
}

コンソールでいうところのこの部分

CloudWatchEventsのルールからターゲットの中からファンクション名で絞り込む

target.getArn()

これで、各ターゲットが下記のような形で返却される
arn:aws:lambda:region:xxxxxx:function:functionName

なので、endWithで絞り込む

if (target.getArn().endsWith("絞り込みたいファンクション名")) {
    // 
}

コンソールでいうところのこの部分(このコンソール画面の場合だとそもそも一つしかないので、やってもやらなくてもどちらでもいいのだけども。)

CloudWatchEventsのルールからターゲットの中から引数(入力)を取得する

target.getInput()

コンソールでいうところのこの部分

// cloudWatch のInputをjsonで記載しているので jsonからbeanに変換
SomethingBean cloudWatchInput = Jackson.fromJsonString(target.getInput(), SomethingBean.class);

あとは、今まで取得したCloudWatchEventsのルール名、説明、引数など出力したい形に整形して、outputに返してあげれば終了。

今回追加したPOM

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-cloudwatch</artifactId>
    <version>1.11.99</version>
    <scope>compile</scope>
</dependency>
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-events</artifactId>
    <version>1.11.719</version>
    <scope>compile</scope>
</dependency>