ヘッダー画像

【AWS】SSMを使ってLambdaでセキュアな文字列を扱う

投稿 2024年10月27日 最終更新 2024年10月27日 専門用語少なめ

パラメータストア作成方法

Systems Managerを開く

検索AWSの画面上部にある検索画面に「ssm」と入力します。

検索結果入力して出てきた「Systems Manager」をクリックします。

パラメータストアを作成

初期画面左上のハンバーガーボタン(三)をクリックします。

ハンバーガーメニューパラメータストアをクリックします。

パラメータパラメータの作成をクリックします。

パラメータを作成

パラメータの詳細

名前名前にお好きな名前を入力します。

「/」で区切って管理しやすくすることも可能です。
※しなくても大丈夫です

利用枠利用枠は標準で問題ないです。

タイプ今回セキュアな情報を管理したいため、安全な文字列を選択します。

KMS キーソース現在のアカウントを選択します。
デフォルトのキーを使用するので、そのままで大丈夫です。

KMS キー ID「alias/aws/ssm」を選択します。
デフォルトのキーを使用するので、そのままで大丈夫です。

値セキュアに保存したい値を入力します。

タグ

タグタグを設定しますが、今回は使用しません。

コスト管理やアクセスコントロールに使用します。

最後にパラメータの作成ボタンをクリックして、作成は完了です。

Lambda

取得処理

Lambdaからは下記処理で取得できます。

import {GetParameterCommand, SSMClient} from "@aws-sdk/client-ssm";

export const handler = async (event, context, callback) => {
  // パラメータストアの名前定義
  const ssmParameterName = "/lambda/api-key";

  // SSMクライアント
  const ssmClient = new SSMClient({
    region: "ap-northeast-1",
  });

  // パラメータストアに保存したセキュアな文字列取得
  const apiKey = await ssmClient
    .send(
      new GetParameterCommand({
        Name: ssmParameterName,
        WithDecryption: true,
      }),
    )
    .then((response) => response.Parameter.Value);

  console.log("APIキー", apiKey);
};

IAMポリシー

Lambdaに必要なIAMポリシーは以下の通りです。

Decryptは暗号化されたものを復号するため、
GetParameterがパラメータストアから取得する権限です。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "kms:Decrypt",
        "ssm:GetParameter"
      ],
      "Resource": [
        "arn:aws:kms:ap-northeast-1:{アカウントID}:key/{KMSキーID}",
        "arn:aws:ssm:ap-northeast-1:{アカウントID}:parameter/lambda/api-key"
      ]
    }
  ]
}

パラメータストアとSecrets Manager

セキュアな文字を保存する際にSecrets Managerと、
Systems Managerのパラメータストア、
どちらが良いかは調べるといろいろ論争がありますが、個人的には

自動ローテーションがいらないならSSMパラメータストア
できる限り安いほうがいいならSSMパラメータストア

それ以外はSecrets Managerという印象です。

まとめ

セキュアな文字列を保存して、Lambdaから使用する方法をまとめました。

昨今いつだれでも攻撃の対象となるため、セキュリティ対策は常に行っていきましょう。

以上、ここまで見ていただきありがとうございます。

皆さまの快適な開発ライフに、ほんの少しでもお役に立てれば幸いです。

コメント

この記事のコメントはありません。