Lambdaから同一アカウント内のEC2インスタンス情報を取得する

# ゴール
1つのAWSアカウント内にあるEC2インスタンスの情報を取得する

# 前提
・EC2にインスタンスが1つ以上存在する
・LambdaのランタイムはNode.js 14.x
・OSはWindows(10 Pro)

# やることたち
①Lambda関数を作成する
②Lambdaのレイヤーを作成
③Lambda関数に割り当てたロールの権限を設定する
④コードを書き、実行する

# ①Lambda関数を作成する
・コンソール画面からLambdaの画面を開き、「関数の作成」を押下する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455207/459bc224-4639-5fca-6758-4aab8ce196d6.png)

・「一から作成」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455207/533cb7e8-cbdd-999a-8224-87da3f3469f1.png)

・基本設定を行う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455207/c05e4e1e-fc6c-b45c-5086-ee1845ed388c.png)

・デフォルトの実行ロールの変更は以下を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455207/8e83b329-8c77-a330-3df2-4c3148222ae1.png)

・関数の作成を押下して、作成完了

# ②Lambdaのレイヤーを作成
Node.jsでAWSの操作をするために、Layersを追加します
※レイヤーそのものの設定方法は以下リンクを参照してください。
https://qiita.com/DJROU/items/bcdc2902757e606e9226

作成した関数の中でレイヤーを設定します

・画面上部のLayersを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455207/5067e31b-f238-32d9-9f61-6de0cc7ca4d2.png)

・レイヤー > レイヤーの追加を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455207/946724fd-6775-e64b-8602-76d38e637e23.png)

・作成済の「カスタムレイヤー」でnode_modulesの作成したバージョンを押下し、「追加」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455207/3ab4a726-32b7-b242-be61-012cc1dbbd39.png)

・Layers(1)のようにレイヤーが追加されていたら完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455207/29290ccf-f3ab-922c-9eee-456377867a63.png)

# ③Lambda関数に割り当てたロールの権限を設定する
コンソールからIAMの画面を開きます。
・IAM > ロールにて作成したLambda関数名が入ったロールを開く(例は getEC2Info-role-ntoxqcyo)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455207/e201ce96-c098-1fc7-070f-7ed584450989.png)

・ロールの概要 > アクセス権限 にてアタッチされているポリシーを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455207/ec51f6c1-e5b2-85be-67f8-2f846723665b.png)

・ポリシーの概要画面 > アクセス権限 にてポリシーの編集を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455207/f204fd14-b5f1-7017-e6e2-c66ef2c76119.png)

・「＋アクセス許可を追加する」で以下のように設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455207/f50fc696-3dbc-35a8-e2f7-fc3ad1024f72.png)

　サービス：EC2
　アクセスレベル：リスト > DescribeInstances

を追加し、「ポリシーの確認」→「設定の保存」して完了！
これでLambdaがEC2インスタンス一覧を取得する権限が与えられます。

# ④コードを書き、実行する
https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/EC2.html
に詳細が書いてありますが、以下に一例を示します。

・以下のようにコードを書き、「Deploy」
例1:全インスタンスを取得

```javascript:index.js
const AWS = require('aws-sdk');
AWSconfig.region = 'ap-northeast-1';

exports.handler = function(event, context, callback) {
    const ec2 = new AWS.EC2({apiVersion: '2016-11-15'});
    // describeInstancesの第一引数は空っぽ
    ec2.describeInstances({}, function(err, data) {
        console.log(AWS.VERSION);
        if (err) {
            console.log("NG", err);
            console.log(err, err.stack); // an error occurred
            return AWS.VERSION;
        }
        else {
            console.log(data);
            console.log(data.Reservations[0].Instances);
            return data.Reservations[0].Instances;
        }
    });
};
```

例2:インスタンスタイプでフィルタリング

```javascript:index.js
const AWS = require('aws-sdk');
AWSconfig.region = 'ap-northeast-1';

exports.handler = function(event, context, callback) {
    const ec2 = new AWS.EC2({apiVersion: '2016-11-15'});
    // paramにてフィルタリング条件を用意
    const params = {
        Filters: [
            {
                Name: "instance-type", 
                Values: [
                    "t2.micro"
                ]
            },
        ]
    };
    
    ec2.describeInstances(params, function(err, data) {
        console.log(AWS.VERSION);
        if (err) {
            console.log("NG", err);
            console.log(err, err.stack); // an error occurred
            return AWS.VERSION;
        }
        else {
            console.log(data);
            console.log(data.Reservations[0].Instances);
            return data.Reservations[0].Instances;
        }
    });
};
```

・「test」はデフォルトのまま適当な名前を付けて「作成」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455207/02f991ce-9d6f-ce49-fa07-fd3fdfff3929.png)

# 終わり