MENU

AWS SAMでParameter Storeからパラメータを取得するためのIAMロールの作成

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のパラメータへのアクセスを許可しています。

ここで、regionaccount-idはそれぞれAWSリージョンとあなたのAWSアカウントIDを表します。これらを適切な値に置き換えてください。

補足情報:

この例ではパラメータ取得のための権限 (ssm:GetParametersssm: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に突っ込んでいます。

ただし、これは実は冗長で、テンプレートファイルから直接取得することができます。次回は環境変数の管理方法ではなく、テンプレートファイルから直接取得する方法です。

以下は質問。

  1. AWS SAMのテンプレートで、パラメータストアから特定のパラメータについて取得するための権限の書き方は?
  2. うまくいきました。適切なロールだったようですね。備忘録にしたいので、ブログ記事としてまとめてください。

備忘録だっつってんのに次回作書きたがるChatGPTwwwとか言ってたら知らないこと書かれてしまった……。

目次