【AWS】【Lambda】【Boto3】稼働中のEC2インスタンスを取得する

ご無沙汰しております。オンラインコンサルタントの直井です。だいぶ気温も上がり、桜の花びらが開き始め春の訪れを感じることができるようになってきました。

さて、今回はLambda(Python)を使って稼働中のEC2インスタンスの情報を取得する方法をご説明致します。

import json
import boto3

def lambda_handler(event, context):
    ec2 = boto3.client('ec2')
    try:
        name_tag_key = 'tag:aws:autoscaling:groupName'
        name_tag_value = '' #特定のNameタグがついているインスタンスに絞り込み
        instance_state_key = 'instance-state-name'
        instance_state_value = 'running' #稼働中のインスタンスに絞り込み
        reservations = ec2.describe_instances(
                Filters=[{'Name':name_tag_key ,'Values':[name_tag_value],},{'Name': instance_state_key,'Values': [instance_state_value]}])
    except ClientError as e:
        print('#ClientError!! at get_instance()')
        raise e

tag:aws:autoscaling:groupNameでASGのNameタグが付与されているインスタンスに絞り込みます。更に、instance-state-nameがrunningのインスタンスへ絞り込みます。

意外に稼働中(runnning)への絞り込みが足りず終了したばかりのインスタンスを取得してしまうことがしばしあります。ご安全に

【Vue】Composition API のCDNなどでできるめちゃ簡単なサンプルコード

どうも、Vueに時々取り組んでいる私です。

さて、Composition APIというものがありまして、Composition APIを説明してくれているサイトもいっぱいあります。公式サイト

ただ、私はまずは触ってみたいと思うタイプなので、サクッと試したいなと思って
「 Composition API  サンプル」
と検索してみても、nodeモジュール入れましょうとか、TypeScriptで作りましたとか、そういうちょっと手間がかかるサンプルが多かったので、私のような人のために載せておきます。

というわけで、以下Vueとcomposition APIはCDNから読み込みでやる(URLで読み込むということです)めちゃくちゃ簡単なサンプルです。

Vueのバージョン:2.6.10
Composition API:1.7.1

<!DOCTYPE html>
<html lang=”ja”>
<head>
    <meta charset="UTF-8">
    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js"></script>
</head>
<body >
<div id ="sample">
    <div>性<input type="text" v-model="lastName"></div>
    <div>名<input type="text" v-model="firstName"></div>
    <div>フルネーム:{{fullName}}</div>
</div>
<script src ="https://cdn.jsdelivr.net/npm/@vue/composition-api@1.7.1"></script>
<script type="text/javascript">
    const ref = VueCompositionAPI.ref
    const computed = VueCompositionAPI.computed

    new Vue({
        el:'#sample',
        setup(){
            const lastName = ref('渋川')
            const firstName = ref('剛毅')
            const fullName = computed(() => lastName.value +' '+ firstName.value)
            return {lastName, firstName, fullName}
        }
    })

</script>
</body>

上記をコピペしてsample.htmlという名前で保存して、ブラウザで開けばできます。

ここではComposition APIとはなんだとか、上記のコードの解説はしません。

私的にはこちらの記事がわかりやすかったです。

https://kobatech-blog.com/vue-composition-api/


S3のオブジェクトをAWS CLIを利用して一括でダウンロードする

表題の通りです。

【 AWS 公式 ドキュメント】 オブジェクトのダウンロード

S3コンソールの使用のところの注記に「一度にダウンロードできるオブジェクトは 1 つだけです。」とあります(2023/02/17時点)。

ディレクトリをダウンロードしようとチェックを入れても、ダウンロードの部分が有効になりません。

コンソールでやろうとするのは諦め、aws-cliを利用して行いました。

aws-cliのバージョンは、2.2.38です。

上の画像にある「testdir」をダウンロードしたいと思います。
コンソールでダウンロードしたいオブジェクトをクリックして、「S3 URIをコピー」しておきます。

注意点ですが、 公式ドキュメントにあるように

オブジェクトをダウンロードすると、データ転送料金が適用される

ので、不必要に大きな容量をダウンロードするのはやめた方がいいと思います。

実行コマンドは下記です。

aws s3 cp コピーしたURI コピーしたいローカルPCのパス --recursive

自分は、ホームディレクトリにあるドキュメントのtestディレクトリに入れたかったので以下のコマンドでダウンロードしました。

容量不足は突然に…

リモートの開発環境にプロジェクトで必要になった新たなコンテナを試しに起動してdocker composeに記載することをしていたら、突然保存ができなくなってしまいました。
dockerでポコポココンテナ建ててた以外になにもしていなかったので、正直困惑していました。

1. 犯人探し

まずは、ディスクの空き容量を確認してみましょう。ディスク容量の確認は以下のコマンドを打ち込むと簡単に確認できます。
ちなみに、-hオプションは、人間に読みやすいように表示してくれます。

df -h

ディスク容量が100%になってしまっています!これで保存できない原因がなにかの不具合ではなく、本当に容量が足りないということが判明しました。


次に、どこのディレクトリが容量を食っているのか確認していきましょう。
duコマンドでディレクトリごとにどれくらい容量があるのか表示してくれます。
手始めに、一番上の階層から確認するのが妥当でしょう!

sudo du -shc /*

/var が58GBくらい使っていました…..

さらにduコマンドでvar配下を見てみましょう

sudo du -shc  /var/* | sort -rn

/var/libが58GBの大半を占めているようです。

さらに、duコマンドで奥地に足を踏み入れてみましょう。

sudo du -shc  /var/lib/* | sort -rn 

/var/lib/dockerがとてつもなく肥大化している模様です…
いろいろなイメージやコンテナキャッシュがあるのでもしかしたらと思っていましたが、ここまで肥大化するとは思っても居ませんでした。

しかし、何に対処すればいいのか?が明確になったので、ここからはDocker との戦いを開始します。


2. Dockerの不要なデータを削除

不要なイメージを削除しましょう。使っていない不要なイメージがあるはずです。

docker image prune -f

と、思ったのですが表示された内容は「Total reclaimed space: 0B」と何も消すものが無いという状態….

こうなったら、奥の手を使うほかありません。ボリューム・イメージ・コンテナで不要なものを全て消し去るコマンドを実行します。

docker system prune -a

最後に容量が増えているか確認してみましょう…

df -h

これで、スッキリ年末の大掃除完了です。

【Java】Gsonオブジェクトが、toJsonメソッドを呼び出した際に値がnullのものは、消失してしまう

タイトルだけだとどういうことかわからないので、サンプルを書きます。

目標はGsonを使って以下のようなJsonを生成することです。

{"hoge":"hoge","fuga":null}

Gsonを使ってJsonを生成するのは慣れていた(つもり)だったので以下のようにサラサラと書いてみます。

Map<String, String> map = new HashMap<>();
map.put("hoge", "hoge");
map.put("fuga", null);

Gson gson = new Gson();
String json = gson.toJson(map);

jsonの中身を見ると…

{"hoge":"hoge"}

俺のfugaが消えています…

調べてみると、GsonにはBuilderが用意されてて、そこでserializeNulls()を呼んで create()すると良いみたいです。

Map<String, String> map = new HashMap<>();
map.put("hoge", "hoge");
map.put("fuga", null);
GsonBuilder gsonBuilder = new GsonBuilder().serializeNulls();
Gson gson = gsonBuilder.create();
String json = gson.toJson(map);

結果

{"hoge":"hoge","fuga":null}

fugaを取り戻しました。

serializeNulls()の中身を見ると、GsonBuilderのserializeNullsプロパティがtrueにするような処理が走っていました。
serializeNullsプロパティはデフォルトではfalseになっていました。

そもそも GsonBuilder なるものがあるのを知らなかったですね…勉強になりました。

<参考サイト>

【Quita 】Gsonはデフォルトではnullなフィールドをシリアライズしない