AWS SAMでどこを参照して良いのかいつも迷子になるテンプレートファイルの書き方。パラメータストアはいつも使うやつではないので、たまに使おうとすると「どう書くんだっけ……」と忘れている。
ChatGPT-4に聞いて確認しました。結果、そもそもコードで取得しなくて良いということがわかりましたが(後述)、本記事自体はあくまでコードでパラメータを取得するためのIAMロールを作成する方法になります。
はじめに
AWS SAM (Serverless Application Model) を使用してサーバーレスアプリケーションを構築する際、しばしば環境変数や設定値などをAWS Systems Manager Parameter Storeから取得する必要があります。これを適切に行うためには、Lambda関数に対してParameter Storeへのアクセス権限を持つIAMロールを付与する必要があります。本記事では、そのIAMロールをAWS SAMテンプレートでどのように定義すればよいかを詳しく解説します。
IAMロールの作成
以下のYAML形式のコードスニペットは、AWS SAMテンプレート内でIAMロールを定義する方法を示しています。
Resources:
MyRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service:
- lambda.amazonaws.com
Action:
- sts:AssumeRole
Policies:
- PolicyName: ParameterStoreAccess
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- ssm:GetParameters
- ssm:GetParameter
Resource: arn:aws:ssm:region:account-id:parameter/MyParameter
このテンプレートでは、MyRole
という名前のIAMロールが作成され、このロールはLambdaサービスがAssumeRoleを行えるようになっています。また、そのロールにはParameterStoreAccess
という名前のポリシーが付与されており、このポリシーはMyParameter
という名前のParameter Storeのパラメータへのアクセスを許可しています。
ここで、region
とaccount-id
はそれぞれAWSリージョンとあなたのAWSアカウントIDを表します。これらを適切な値に置き換えてください。
補足情報:
この例ではパラメータ取得のための権限 (ssm:GetParameters
と ssm:GetParameter
) をIAMロールに付与していますが、他の権限も必要な場合はそれぞれ追加してください。また、特定のパラメータだけでなく、すべてのパラメータにアクセスする権限を付与したい場合は、リソースのARNをarn:aws:ssm:region:account-id:parameter/*
としてください。
まとめ
AWS SAMテンプレートでIAMロールを適切に定義し、Lambda関数にParameter Storeへのアクセス権限を付与することで、安全にParameter Storeからパラメータを取得することが可能になります。これにより、サーバーレスアプリケーションの設定値管理を柔軟に行うことができます。
次回は、AWS SAMテンプレートでの環境変数の管理方法について詳しく解説します。お楽しみに!
(著者注:そんな予定はない)
寸評
次回作が出てきて笑ってしまった。そんな予定があったのかw
内容については動作確認済みです。適切だと思います。Pythonコードは以下ですね。
ssm = boto3.client("ssm")
TOKEN = ssm.get_parameters(Names=[os.environ["パラメータ"]], WithDecryption=True)[
"Parameters"
][0]["Value"]
"パラメータ"の値を取得してTOKEN
に突っ込んでいます。
ただし、これは実は冗長で、テンプレートファイルから直接取得することができます。次回は環境変数の管理方法ではなく、テンプレートファイルから直接取得する方法です。
以下は質問。
- AWS SAMのテンプレートで、パラメータストアから特定のパラメータについて取得するための権限の書き方は?
- うまくいきました。適切なロールだったようですね。備忘録にしたいので、ブログ記事としてまとめてください。
備忘録だっつってんのに次回作書きたがるChatGPTwwwとか言ってたら知らないこと書かれてしまった……。