📘

(typescript)AWS Parameters and Secrets Lambda Extensionを使ったcdkコード

に公開

secret managerを取得するlambdaを久々に1から書いたのだが、
AWS Parameters and Secrets Lambda Extensionなるものがあったので利用するようにしてみた。
だいぶ古くからある機能。昔ニュースで読んだような記憶が。。。

secret managerに何度も値を取得せず、キャッシュすることができるため
呼び出し回数を減らすことができるよう。

https://docs.aws.amazon.com/ja_jp/secretsmanager/latest/userguide/retrieving-secrets_lambda.html

公式のコードサンプルはpythonで
typescriptで動くコード作成したので
備忘も含めてブログに書こうと思います。

    const secretName = 'sample';
    const secrets = new secretsmanager.Secret(this, 'Secrets', {
      secretName: secretName,
    });
    const paramsAndSecrets = lambda.ParamsAndSecretsLayerVersion.fromVersion(
      lambda.ParamsAndSecretsVersions.V1_0_103,
      {
        cacheSize: 500,
        logLevel: lambda.ParamsAndSecretsLogLevel.DEBUG,
      }
    );
    const lambdaFunction = new lambdaNodejs.NodejsFunction(this, 'Lambda', {
      runtime: lambdaNodeRunTime,
      entry: 'lib/resources/lambda/xxxx.ts',
      handler: 'handler',
      architecture: lambda.Architecture.ARM_64,
      timeout: Duration.seconds(60),
      logRetention: accessLogDuration,
      paramsAndSecrets,
      environment: {
        SECRET_ID: secrets.secretName,
      },
    });
    props.snsTopic.addSubscription(new subs.LambdaSubscription(lambdaFunction));
    secrets.grantRead(lambdaFunction);

lambdaの中に書くコード

const AWS_SESSION_TOKEN = process.env['AWS_SESSION_TOKEN'] || '';
 // AWS Parameters and Secrets Lambda Extension
  const getSecretResponse = await axios.get(
    'http://localhost:2773/secretsmanager/get',
    {
      params: {
        secretId: SECRET_ID,
      },
      headers: {
        'X-Aws-Parameters-Secrets-Token': AWS_SESSION_TOKEN,
      },
    }
  );

 const secretValue = getSecretResponse.data.SecretString //secretの中身

Discussion