【AWS】パラメータストアの値をLambdaから取得する

【AWS】パラメータストアの値をLambdaから取得するAWS
ゆうすけ
ゆうすけ

パラメータストアに登録しているパラメータを
Lambdaから取得したいです。

資格マフィア
資格マフィア

意外と簡単だぞ。以下の3つの設定をすれば良い。

  1. パラメータストアにパラメータを登録する
  2. Lambdaを用意する
  3. Lambdaに必要な policy をアタッチする

 

✔️ 本記事のテーマ

 AWS Systems Manager パラメータストア の値を Lambda から取得する方法

 

✔️ 読者さんへの前置きメッセージ

本記事は「パラメータストアの値をLambdaから取得する方法」について書いています。

 

この記事を読むことで

  • AWS Systems Manager パラメータストア の使い方
  • パラメータストア を使うためにAWS上で必要な設定

について理解できます。

 

パラメータストアを使うことで、

  • システムの定数値などをcode から切り出して定義する
  • アクセスキーなどのセキュアな情報を code に含めずに定義する

などが可能になります。

 

今回はそんな AWS Systems Manager パラメータストア に登録したパラメータ値を
AWS Lambda から取得する方法について解説します。

 

サンプルコードや画面のスクリーンショットを載せているので
ご自身のAWSコンソールと見比べながら進めて頂くとより分かりやすいかと思います。

 

それでは、解説していきましょう。

AWS Systems Manager パラメータストア とは?

AWS Systems Manager パラメータストア とは?

AWS Systems Manager パラメータストアとは
システムで使用するパラメータや定数を切り出して定義するサービスです。

 

以下のような画面で定義するので、
DBのテーブルをイメージされるのが一番近いかも知れません。

パラメータストアの定義画面

 

今回はこのテーブルをLambdaから参照して、その値を取得する方法を解説します。

 

なお、AWS Systems Manager パラメータストアを使用するメリットについては
【AWS】パラメータストアを使うメリット
の記事で解説しています。

 

AWS Systems Manager パラメータストア を使用したアーキテクチャ

AWS Systems Manager パラメータストア を使用したアーキテクチャ

今回、構築するアーキテクチャは以下の通りです。

AWS Systems Manager パラメータストア のアーキテクチャ図

 

パラメータストアの使い方解説がメインなので、最小構成にしています。

 

対象のS3へのオブジェクト作成イベントをきっかけに、
Lambdaが動いて、パラメータストアから値を取得します。

 

AWS Systems Manager パラメータストア を使うために必要な3つのこと

AWS Systems Manager パラメータストア を使うために必要な3つのこと

AWS Systems Manager パラメータストア を使うためには行うべき設定があります。

  1. パラメータストアにパラメータを登録する
  2. Lambdaでパラメータストアにアクセスするコードを書く
  3. Lambdaをキックするイベントを追加する
  4. パラメータストアにアクセスするためのポリシーをLambdaにアタッチする

 

文章にすると分かりづらいですが、それぞれ簡単な作業です。

 

順番に解説していきましょう。

 

パラメータストアにパラメータを登録する

まず、パラメータストアにパラメータを登録していきましょう。

 

AWS コンソールの検索窓で「パラメータストア」と検索すると、
AWS Systems Manager > パラメータストア コンソール画面にアクセスできます。

パラメータストアのコンソール画面

 

「パラメータの作成」ボタンを押下すると、
パラメータ作成画面にアクセスするので、以下の情報を入力します。

  • 名前:パラメータ名。システム内でこの名前が参照されます。
  • 説明:パラメータの説明。これは自分さえ分かれば、適当で良いです。
  • 利用枠:「標準」であれば追加料金は発生しません。(2021/02/02時点)
  • タイプ:今回は「文字列」を選択します。 
  • データ型:今回は「text」にします。
  • 値:ここがパラメータ値として定義されます。

パラメータストアのパラメータ作成画面

 

全て入力・選択したら、
画面下部の「パラメータを作成」ボタンを押下するとパラメータが作成されます。

 

今回は「PERSON_NAME」「AGE」の2つのパラメータを登録します。

パラメータストアのパラメータ一覧

 

これでパラメータストアでの設定は完了です。

 

Lambdaでパラメータストアにアクセスするコードを書く

次は、コードを書いていきましょう。

 

AWS コンソールの検索窓で「lambda」と検索すると、
AWS Lambda コンソール 画面にアクセスできるので、
「関数の作成」ボタンを押下します。

AWSLambdaコンソール画面

 

以下の設定にして、「関数を作成」ボタンを押下します。

  • オプション:一から作成
  • 関数名:getParameterFromSsm(任意の名前で良いです)
  • ランタイム:Python3.8(Python3であれば任意のversionで良いです)

AWSLamba作成画面

 

すると、AWS Lambda コンソール画面に以下のようなワークフローが表示されます。

AWSLambdaのワークフロー

 

画面を下にスクロールして、
「関数コード」項の lambda_function.py というファイルをクリックします。

 

すると、以下のようにLambdaで実行するコードをできます。

AWSLambdaのコード作成画面

 

今回は以下のようなコードを記載します。

import json
import boto3


def get_ssm_params(*keys, region='us-east-2'):
    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('PERSON_NAME', 'AGE')
    print(
        'My name is ' + parametes['PERSON_NAME'] + '.' +
        'I am ' + parametes['AGE'] + ' years old.'
    )
    
    return {
        'statusCode': 200,
        'body': json.dumps(
            'My name is ' + parametes['PERSON_NAME'] + '.' +
            'I am ' + parametes['AGE'] + ' years old.')
    }

AWSLambdaのコード編集画面

 

コードを書き換えたら、「Deploy」ボタンを押下しましょう。

 

緑色で「Changes deployed」と表示されていればOKです。

AWSLambdaのコードdeploy画面

 

 

Lambdaでパラメータストアにアクセスするコードの解説

ここで今回 Lambdaに搭載したコードについて解説しておきます。

 

def get_ssm_params()

この関数でパラメータストアからパラメータを取得しています。

 

以下の部分で、AWSのAPIである GetParametrs を使い、
引数で渡された keys と同じ NAME のパラメータを探しにいって、その値を取得しています。

ssm = boto3.client('ssm', region)
response = ssm.get_parameters(
    Names=keys,
    WithDecryption=True,
)

 

そして、NAME: Value のセットで辞書をつくり、その辞書return しています。

for p in response['Parameters']:
    result[p['Name']] = p['Value']

return result

 

 

def lambda_handler(event, context):

この関数がLambdaがキックされた時に実行される関数です。

 

処理としては

  • 上述したget_ssm_params()でパラメータを取得する
  • そのパラメータを使ってprint出力を構築する

ということを行っています。

parametes = get_ssm_params('PERSON_NAME', 'AGE')
print(
    'My name is ' + parametes['PERSON_NAME'] + '.' +
    'I am ' + parametes['AGE'] + ' years old.'
)

 

今回は処理としては最低限にして、
「print()で出力して、ログでそれを確認する」ということをやっていきます。

 

なお、今回使用したget_parameters の詳しい仕様や注意点については
【AWS SSM】get_parametersの仕様【パラメータストアから値を取得する】
の記事で解説しています。

 

Lambdaをキックするイベントを追加する

Lambdaにコードを搭載したら、
Lambdaを動かすためのイベントを登録しましょう。

 

今回は最も簡単なイベント「S3オブジェクトの作成」を設定します。

 

まず対象のS3を作成しましょう。

 

AWS コンソールの検索窓で「S3」と検索すると、
S3 コンソール 画面にアクセスできるので、「バケットを作成」ボタンを押下します。

AWSS3のコンソール画面

 

以下の設定にして、画面下の「バケットを作成」ボタンを押下します。

  • バケット名:get-parameter-input(任意の名前で良いです)
  • リージョン:us-east-2
  • その他:デフォルトのまま

※ リージョンはLambdaと合わせる必要があります。
基本的には、デフォルトでLambdaと同じはずなのでそのままでOKです。

AWSS3作成画面

 

S3バケットを作成したら、
AWS Lambda コンソール 画面に戻り、「トリガーを追加」ボタンを押下します。

 

トリガー追加画面に遷移するので、検索窓に「S3」と入力して、S3を選択します。

トリガー追加画面

 

S3 トリガーのオプション画面になるので、
以下の設定にして、画面下の「追加」ボタンを押下します。

  • イベント:get-parameter-input
  • イベントタイプ:すべてのオブジェクト作成イベント
  • その他:デフォルトのまま(空白)

トリガー追加オプション画面

 

これで、AWS LambdaをキックするためのS3イベントが追加されます。

イベントトリガー追加完了画面

パラメータストアにアクセスするためのポリシーをLambdaにアタッチする

最後に、ポリシーを作成しましょう。

 

今回、Lambda は AWS Systems Manager パラメータストア からパラメータを取得します。

 

ただし、AWS Lambdaはデフォルトではパラメータストアにアクセスする権限を持ってないので、この権限を付与してあげる必要があります。

 

AWS コンソールの検索窓で「IAM」と検索すると、
IAM コンソール画面にアクセスできるので、リンクナビゲーションの「ポリシー」を押下します。

IAMリンクナビゲーション画面

 

ポリシー一覧画面に遷移するので、「ポリシーの作成」を押下します。

IAMポリシー一覧画面

 

ポリシー作成画面に遷移するので、
「JSON」タブに切り替えて、以下の内容を記載します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ssm:GetParameters"
            ],
            "Resource": "*"
        }
    ]
}

IAMポリシーのJSON編集画面

 

これで GetParameter を使って、
パラメータストア からパラメータを取得する権限を持つポリシーになります。

 

「ポリシーの確認」ボタンを押下して、
ポリシー名説明を適当に入力して、
「ポリシーの作成」ボタンを押下するとポリシーが作成できます。

 

作成に成功すると、
ポリシーへのリンクが表示されるので、
リンクをクリックして個別のポリシー画面にアクセスします。

ポリシーの作成成功画面

 

個別のポリシー画面「ポリシーの使用状況」タブで「アタッチ」ボタンをクリックします。

IAMポリシーアタッチ画面

 

Lambda の実行ロールを選択して、
「ポリシーのアタッチ」をクリックしてポリシーを作成します。

 

これで、Lambda にパラメータストアへアクセスするための権限を付与できました。

 

パラメータストアの値をLambdaから取得する

では、ここまでの設定 & コードで準備は完了したので、
実際にLambdaをキックして、パラメータストアからパラメータを取得してみましょう。

 

Lambdaのキックイベントを「S3のオブジェクト作成」に設定したので、
S3のget-parameter-inputバケットに適当なファイルをアップロードしてみましょう。

S3のファイルアップロード画面

 

Lambdaが実行されるはずなので、
CloudWatch Logs の対象のログストリームを確認します。

My name is Taro Tanaka.I am 21 years old.

というようにパラメータ値を取得して、ログ出力できていれば成功です。

ログ出力画面

AWSについて独学でスキルをつけるなら

AWSについて独学でスキルをつけるなら

AWS は世界で最もメジャーなクラウドサービスです。

 

モダンなシステム開発のほとんどの現場で採用されているので、
いまや、プログラマーやエンジニアにとって、避けることのできないスキルでしょう。

 

もし、AWSについて独学でスキルをつけるなら、以下の書籍がオススメです。

 

この書籍はAWSについての全てを0から解説しています。

 

AWS を理解するには特有のサービスや考え方の理解が必要となります。この書籍では初学者がつまずきがちなポイントがきちんと解説されているので効率的にスキルを習得できます。
Kindle本もあるので、電子書籍派の方にもオススメできます。

エンジニアとしての自身の価値をチェックする(完全無料)

エンジニアとして、

自分の価値がどれくらいのものかご存知でしょうか?

 

エンジニアとしてIT業界に身を置いていると

今の会社でずっと働くのか、フリーランスとして独立するのか …

と様々な選択肢があります。

 

どの選択肢が正解なのかを見極めるためにも、選択肢を広げるためにも

自身の価値を知っておくことはとても重要です。

 

TechClips ME では、

職務経歴書をアップロードするだけで企業からのスカウトを受けることができます。

▼▼▼▼▼

▲▲▲▲▲

しかもTechClips MEでは想定年収を企業から提示してくれるので、

自身の価値を数字で分かりやすくたしかめることができます。

 

登録はもちろん完全無料なので、一度登録してみると良いかもしれません。

 

コメント

タイトルとURLをコピーしました