Help us understand the problem. What is going on with this article?

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()
}

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

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
}

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

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

target.getArn()

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

なので、endWithで絞り込む

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

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

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

target.getInput()

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

// 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>
t_o01
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away