AWSの部屋

AWS学習者向けのブログです

パラメータストアを使って Lambda から機密情報にアクセスする

はじめに

本日はパラメータストアを使ってみようと思います。AWS認定試験に頻出のサービスなのでしっかり理解しておきたいですね。

パラメータストアとは

AWS Systems Manager のサービスの一つで、データベースへの接続文字列のようなパラメータを一元管理します。

アーキテクチャ

API Gateway 経由でパラメータストアに登録されているDB接続情報を取得します。

手順

  1. 機密情報をパラメータストアに登録
  2. IAMロール 作成
  3. Lambda 関数の作成
  4. API Gateway作成
  5. 動作確認

1. 機密情報をパラメータストアに登録

以下3つの値をパラメータストアに登録します。

DB名

[名前]:db-name
[利用枠]:標準
[タイプ]:安全な文字列
[KMS キーソース]:現在のアカウント
[KMS キー ID]:alias/aws/ssm
[値]:test

ユーザ名

[名前]:user-name
[利用枠]:標準
[タイプ]:安全な文字列
[KMS キーソース]:現在のアカウント
[KMS キー ID]:alias/aws/ssm
[値]:sanvarie

パスワード

[名前]:password
[利用枠]:標準
[タイプ]:安全な文字列
[KMS キーソース]:現在のアカウント
[KMS キー ID]:alias/aws/ssm
[値]:hoge

2. IAMロール 作成

access-parameter-store」という AWS Systems Manager への権限を付与したロールを作成します。

3. Lambda 関数の作成

以下のように Lambda 関数を作成します。

[オプション]:一から作成
[関数名]:get-db-connection
[ランタイム]:Python 3.9
[アーキテクチャ]:x86_64
[既存のロール]:access-parameter-store

ソースコード

パラメータストアに登録されている値を取得します。

import json
import boto3

parameter_names = ['db-name','user-name','password']

def lambda_handler(event, context):

    output_text = get_ssm_param()

    return {
        'statusCode': 200,
        'body': json.dumps({
            'output_text': output_text
        }),
        'isBase64Encoded': False,
        'headers': {}
    }
    

def get_ssm_param():
    ssm = boto3.client('ssm')
    
    response = ssm.get_parameters(
        Names = parameter_names,
        WithDecryption = True
    )
    
    params = {}
    
    # パラメータを配列に格納
    for param in response['Parameters']:
        params[param['Name'] ] = param['Value']

    return params

4. API Gateway作成

REST API として API を作成します。

リソースを作成します。

「3. Lambda関数の作成」で作成した関数名を入力しメソッドを作成します。

Lambda 関数に自動的に API Gateway のトリガーが設定されます。

API をデプロイします。

デプロイ後にエンドポイントの URLが表示されます。

5.動作確認

Postman を使ってエンドポイントの URL に以下のようなリクエストを送ってみます。

https://1f9hnppgfj.execute-api.ap-northeast-1.amazonaws.com/development/parameter

パラメータストアに格納した値を取得することができました。

さいごに

このように パラメータストアを使うことによって簡単に機密情報へのアクセスをすることができます。AWS Secrets Manager を使っても同様のことができますので、二つのサービスの違いを知るために AWS Secrets Manager も使ってみようと思います。