[AWS CDK]SSMのパラメータストアに登録したデータを環境変数にセットする方法

## はじめに
この記事は、[ミロゴス Advent Calendar 2022](https://qiita.com/advent-calendar/2022/milogos) 7日目の記事です。

LINEのチャネルシークレットとアクセストークンをSSMパラメータストアから取得してlambda環境変数にセットした方法をまとめました。

## AWS Systems Manager（SSM）とは
> AWS Systems Manager は、AWS クラウド で実行されるアプリケーションとインフラストラクチャの管理に役立つ一連の機能です。Systems Manager により、アプリケーションとリソースの管理が簡略化され、オペレーション上の問題の検出と解決にかかる時間が短縮されるほか、AWS リソースを大規模かつ安全に管理できるようになります。
 https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/what-is-systems-manager.html

## AWS Systems Manager Parameter Storeとは
> AWS Systems Manager の一機能である Parameter Store は､設定データ管理と機密管理のための安全な階層型ストレージを提供します。パスワード、データベース文字列、Amazon Machine Image (AMI) ID、ライセンスコードなどのデータをパラメータ値として保存することができます。
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-parameter-store.html

## 環境
```sh
cdk version
2.45.0

python version
3.9.6

aws-lambda-powertools version
1.27.0
```

## 実装の流れ

最初に、パラメータストアに必要なデータを登録します。

#### パラメータストアに登録

```sh:ターミナル
aws ssm put-parameter \
    --name "parameter-name" \
    --value "parameter-value" \
    --type SecureString \
    --tags "Key=tag-key,Value=tag-value"

# --name パラメータの名前
# --value パラメータの値
# --type 型
# --tags キーと値
```

上記のコマンドを実行後、AWS Systems Manager > パラメータストアから正常に登録されているか確認します。

![スクリーンショット 2022-12-02 19.43.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952491/2233678c-fe00-3759-4efc-33d6989164b8.png)

#### パラメータ名をlambda環境変数にセット
```python:cdk_stack.py
from aws_cdk import aws_ssm as ssm
from aws_lambda_python_alpha as python_lambda

function_object = python_lambda.PythonFunction(
    #
    # 省略
    #
    environment={"ENV_PARAMETER_NAME": "parameter-name"}
)

# セキュリティで保護された文字列パラメータをインポートする場合
param = ssm.StringParameter.from_secure_string_parameter_attributes(self, "MySecureValue",
    parameter_name="parameter-name"
)

# 権限の付与
param.grant_read(grantee=function_object.handler)
```
CDKからlambdaへ環境変数をセットした後に対象のlambdaにaws_ssmのライブラリを使用して
SSMパラメータへの読み取り権限を付与します。

- StringParameter  (クラス)
  - 新しい文字列 SSM パラメータを作成します。

- from_secure_string_parameter_attributes  (静的メソッド)
  - SSM パラメータ ストアからセキュリティで保護された文字列パラメータをインポートします。

- grant_read (メソッド)
  - SSM パラメータに対する読み取り (DescribeParameter、GetParameter、GetParameterHistory) 権限を付与します。
  - 引数の型はIGrantable。詳細は下記のURLに乗っております。  
https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_iam.IGrantable.html

#### パラメータの値を取得
```python:index.py
from aws_lambda_powertools.utilities import parameters

value = parameters.get_parameter("parameter-name", decrypt=True)
# decrypt=True 暗号化されたデータを復号します
```
lambda上からlambda-powertoolsのparametersを使用してパラメータ名から値を取得します。

※パラメータストアに登録した型がSecureStringの場合
パラメータは暗号化されているため、取得の際に復号します。

- parameters  (クラス)
  - AWS Systems Manager Parameter Store、AWS Secrets Manager、AWS AppConfig、Amazon DynamoDBから 1 つまたは複数のパラメータ値を取得するか、独自のものを持ち込むための高水準関数を提供します。    
- get_parameters  (メソッド)
  - (SSM) パラメータストアからパラメータ値を取得する  


#### 確認
下記２点が確認できれば完了です。
- lambda > 環境変数からパラメータ名が存在しているか
![スクリーンショット 2022-12-02 19.45.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952491/0eb07c65-1899-6303-5917-e5958db64615.png)

- lambda上からパラメータの値が取得できているか
  - ロググループ > ログイベントから確認
![スクリーンショット 2022-12-06 11.00.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952491/f2533a94-f902-d5aa-38a1-723a71f26267.png)

## おわりに
AWS CDKを触ったばかりで知らないこともたくさんありますが
覚えたことを少しづつアウトプット出来ればと思います。

## 参考
https://docs.aws.amazon.com/cdk/api/v1/python/aws_cdk.aws_ssm/StringParameter.html
https://awslabs.github.io/aws-lambda-powertools-python/2.3.0/utilities/parameters/