【初心者向け】VPCに配置したLambdaからSSMパラメータストアの値を取得する方法

# はじめに
LambdaからSSMパラメータストアに値を取得して何らかの処理をするケースはよくあるかと思います。
また、要件次第ではLambdaをVPCに配置する必要があったりします。
VPC外のLambdaからSSMパラメータストアに値を取得する手順はネットにいくつか公開されていますが、VPCに置いたLambdaからSSMパラメータストアに値を取得する手順は日本語記事ではありませんでした。
（あるにはあるが、セキュリティグループの設定が省略されており、そこが原因でハマりました。。）

本記事では、VPCに配置したLambdaからSSMパラメータストアの値を取得する手順を記載します。

# 前提

SSMパラメータストアに以下のパラメータを設定しておきます。
　名前：paramname
　種類：String
　値：任意の文字列を入力してください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485934/79c54a29-bfc4-66c8-388c-e5a177a23774.png)


以下コードのLambda関数がすでにデプロイされている前提です。
``` test.py
import json
import boto3

def get_ssm_params(*keys, region='ap-northeast-1'):
    result = {}
    ssm = boto3.client('ssm', region)
    response = ssm.get_parameters(
        Names=keys,
        WithDecryption=True,
    )
    
    for p in response['Parameters']:
        result[p['Name']] = p['Value']
    
    return result


def lambda_handler(event, context):
    parametes = get_ssm_params('paramname')
    print(
        'My name is ' + parametes['paramname']
    )
    
    return {
        'statusCode': 200,
        'body': json.dumps(
            'My name is ' + parametes['paramname']
        )
    }
```

# VPC外のLambdaからSSMパラメータストアに接続できるか確認

VPCにLambdaを置いた状態でSSMパラメータストアに接続する設定の前に、VPC外に置いたLambdaから値を取得できるか確認します。

## 手順
LambdaからSSMパラメータストアの値を取得するには、ssm:GetParameters権限をLambdaに与える必要があります。
なので、ssm:GetParameters権限を付与するIAMポリシーを作成し、ポリシーをLambdaのIAMロールにアタッチします。

#### IAMポリシーの設定
以下内容のIAMポリシーを作成します。
　ポリシー名：GetParameterFromSSM
　SSMのGetParameters権限を付与します。
``` policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "getParameterFromSSM",
            "Effect": "Allow",
            "Action": [
                "ssm:GetParameters"
            ],
            "Resource": "*"
        }
    ]
}
```

#### LambdaのIAMロールにポリシーをアタッチ
↑で作成したIAMポリシーをLambdaのIAMロールにアタッチします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485934/345a4dd7-b7dc-9601-ce14-84afc80d0498.png)


#### 動作確認
Lambda関数を実行し、SSMパラメータストアから値を取得できるか確認します。
レスポンスのボディ部に、パラメータストアに設定した値が表示されればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485934/6b26f540-2a6b-c5ee-9927-9769d56b7bb3.png)

## VPCに配置したLambdaからSSMパラメータストアの値を取得
では、本記事の本題である、VPC内のLambdaからパラメータストアの値を取得する方法を記載します。
（VPC内のLambdaからパラメータストアの値を取得するにはVPCエンドポイントが必要です）
設定内容は以下です。
　セキュリティグループの用意
　LambdaのVPC設定
　VPCエンドポイントの作成

#### セキュリティグループの用意
Lambda用、VPCエンドポイント用にセキュリティグループを用意します。

・Lambda用
アウトバウンドに以下を設定します。
　タイプ：すべてのTCP
　プロトコル：TCP
　ポート範囲：0~65535
　送信先：0.0.0.0/0
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485934/b9f03526-ed66-b187-44b9-89a625375d9a.png)


・VPCエンドポイント用
インバウンドに以下を設定します。
　タイプ：HTTPS（Lambda→エンドポイントへはHTTPSで通信します）
　プロトコル：TCP
　ポート範囲：443
　送信先：10.0.0.0/16（配置したVPCのCIDRを設定します）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485934/0fda0f63-4b54-d7ce-b562-794d6011ccd2.png)


#### LambdaのVPC設定
LambdaをVPCに配置します。
設定→VPC欄にて編集ボタンをクリックして設定画面を開きます。

配置先VPCとサブネットを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485934/21d56e1b-6a35-217f-6ded-f0721d82c7a0.png)

↑で用意したLambda用セキュリティグループを指定し、保存ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485934/0df90b4e-e453-e02d-347e-40b79689c2af.png)


#### VPCエンドポイントの作成
マネジメントコンソールのVPC→エンドポイントに移動し、エンドポイントの作成をクリックし、エンドポイントの作成画面に移動します。

エンドポイントの名前を入力します。
サービスカテゴリに「AWSのサービス」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485934/9cfc9f94-2201-2424-ef32-e7f714847e41.png)

サービスの検索フォームにssmと入力して検索し、以下のサービスを選択します。
　com.amazonaws.ap-northeast-1.ssm
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485934/7d5ee273-a4ee-0820-1beb-cd553fdd48c4.png)

エンドポイント作成先のVPC、サブネットを指定します。
ここではLambdaと同じVPC、サブネットを指定してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485934/41ef9915-cbed-06c2-35b0-f1f737487d9d.png)

↑で作成したエンドポイント用のセキュリティグループを指定します。
他の設定はそのままでエンドポイントの作成を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485934/5763f118-fbc4-75b1-0695-29e711295f26.png)

作成後、エンドポイントのステータスが使用可能になっていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485934/cdfacc7a-2739-4440-6962-a80b383bcefe.png)


#### 動作確認
Lambda関数を実行し、SSMパラメータストアから値を取得できるか確認します。
レスポンスのボディ部に、パラメータストアに設定した値が表示されればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485934/6b26f540-2a6b-c5ee-9927-9769d56b7bb3.png)

# さいごに
エンドポイントの作成自体は簡単ですが、セキュリティグループを適切に設定しないと、LambdaとVPCエンドポイントの接続ができないので、そこは注意して設定する必要があります。
あと、VPCエンドポイントは従量課金で、作成後お金がかかるので、使わない場合は速やかに削除しましょう。
この記事が少しでも参考になれば幸いです。