LoginSignup
3
1

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-02-26

はじめに

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

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

前提

SSMパラメータストアに以下のパラメータを設定しておきます。
 名前:paramname
 種類:String
 値:任意の文字列を入力してください
image.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

動作確認

Lambda関数を実行し、SSMパラメータストアから値を取得できるか確認します。
レスポンスのボディ部に、パラメータストアに設定した値が表示されればOKです。
image.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

・VPCエンドポイント用
インバウンドに以下を設定します。
 タイプ:HTTPS(Lambda→エンドポイントへはHTTPSで通信します)
 プロトコル:TCP
 ポート範囲:443
 送信先:10.0.0.0/16(配置したVPCのCIDRを設定します)
image.png

LambdaのVPC設定

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

配置先VPCとサブネットを指定します。
image.png

↑で用意したLambda用セキュリティグループを指定し、保存ボタンをクリックします。
image.png

VPCエンドポイントの作成

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

エンドポイントの名前を入力します。
サービスカテゴリに「AWSのサービス」を選択します。
image.png

サービスの検索フォームにssmと入力して検索し、以下のサービスを選択します。
 com.amazonaws.ap-northeast-1.ssm
image.png

エンドポイント作成先のVPC、サブネットを指定します。
ここではLambdaと同じVPC、サブネットを指定してください。
image.png

↑で作成したエンドポイント用のセキュリティグループを指定します。
他の設定はそのままでエンドポイントの作成を実行します。
image.png

作成後、エンドポイントのステータスが使用可能になっていることを確認します。
image.png

動作確認

Lambda関数を実行し、SSMパラメータストアから値を取得できるか確認します。
レスポンスのボディ部に、パラメータストアに設定した値が表示されればOKです。
image.png

さいごに

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

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1