はじめに
この記事は、ミロゴス Advent Calendar 2022 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
環境
cdk version
2.45.0
python version
3.9.6
aws-lambda-powertools version
1.27.0
実装の流れ
最初に、パラメータストアに必要なデータを登録します。
パラメータストアに登録
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 > パラメータストアから正常に登録されているか確認します。
パラメータ名をlambda環境変数にセット
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
パラメータの値を取得
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) パラメータストアからパラメータ値を取得する
確認
下記2点が確認できれば完了です。
おわりに
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/