SSMパラメータを読む3つの方法


AWSシステムマネージャパラメータストア(またはSSMパラメータストア)はAWSで階層的なパラメータを格納する便利な方法です.パスワードやAPIキーのような安全な値を含む任意の設定値を使用できます.それは他のAWSサービスもよく統合します.
SSMからパラメータを読むことに関しては、いくつかの利用可能なオプションがあります.
  • 実行時に読み込む
  • ビルド時に読み込む
  • 展開時に読み込む

  • これらのオプションを考えてみると重要です.
  • ときは、パラメータが利用できるようになることができますか?
  • パラメータ値は変わりますか?
  • パラメータはデータ漏洩から保護されるべき秘密ですか?

  • 実行時の読み込み
    ランタイムでの読み込みは、秘密のパラメータを保護し、ビルド時や展開時に使用できないパラメータを扱うための最も安全な方法です.また、値が頻繁に変化するパラメータに対処するのに役立ちます.パラメータは、AWS SDKを使用して言語を選択できます.JS , Python ) またはSSM API .
    パラメータ値の読み込みを頻繁に行うのは良い考えです.パラメータストアにはthroughput quota デフォルト(40秒あたり)で、あなたがそれを必要とするたびに、値を読むことはレイテンシーを加えます.ここでの典型的な解決策は起動時にロードすることです.たとえば、ラムダ関数のコンテキストでは、パラメーターreadは、コードがブートストラップされたときに実行されるハンドラー関数の外部になります.
    あなたが実行時に古い値の保持を心配する場合は、合理的なタイムアウト後に再読み込みすることができます.ssm-cache PythonとMiddy SSM ノードです.JSラムダ関数は、この簡単なオープンソースライブラリの2つです.
    ランタイムリーディングアプローチは、メモリ内のあなたの秘密のパラメータを保持しているので、限り、これらの値をどこに書かれていない限り、リスクを外すのリスクは、ファイルや環境変数を使用して平文の秘密を含むよりも低いことを安心することができます.

    ビルド時の読み込み
    このオプションと次のいずれかの間に微妙な違いがあります.コードとしてインフラストラクチャを使用しており、ビルド時にコードとインフラストラクチャを一緒に実装しているとしましょう.このパッケージ処理はAWSに展開する前に起こります.
    ビルド時の読み込みでは、SDKまたはAPIを使用してパラメーター値を読み込み、コードのどこかに含めることができます.これは発生する可能性があります.env ラムダ関数環境変数に設定されているファイルまたは値.
    Serverlessフレームワークでは、次のようになります.
    functions:
      getItem:
        handler: handler.handleGetItem
        environment: ${ssm:/path/to/secret}
    
    Serverless Frameworkが小さなコードで値を取得する面倒を見るので、これは本当に便利ですdocs ). 欠点は秘密のパラメータが付属しています.コードまたは環境変数の保護秘密値を格納すると、複数の種類の攻撃に開放されます.
    この例のCloudFormationテンプレートは、SSMパラメーター値がclearのJSONにどのように格納されるかを示します.
       "Environment": {
         "Variables": {
           "SECRET_CODE": "shhhhh!s3cr3t"
         }
       },
    
    ラムダ関数の設定で展開した後も、環境変数を見ることができます.環境変数として利用可能になれば、関数の設定や機能にアクセスできるような悪意のあるコードによって、容易に発見され、また、どのような悪意のあるコードにも適用できます.

    ビルド時の読み込みには、ビルド環境がパラメーターを読み込むための適切な資格情報を持っていることを確認する必要があります.

    展開時の読み込み
    あなたがAWS CloudFormation、またはそれの上に構築された偉大なツールのいずれかを使用している場合CDK , Serverless Framework or SAM , 展開時にSSMパラメータを読み込み、使用する2つのオプションがあります.これは、パラメーターを読み込むための責任は、ビルド後、クラウドスタックが完全スタックのクラウド側の展開を実行するまで延期されます.利点は、ビルド時にパラメータを読み込む権限を必要としないためであり、与えられた環境で展開するまで値を確実にする必要はありません.
    最初のオプションは、CloudFormationパラメータのための特別な構文を使用しています.raw CloudForm YAMLでは、次のように宣言されます.
    resources:
      Parameters:
        UserPoolArnParameter:
          Type: AWS::SSM::Parameter::Value<String>
          Default: /dev/user-service/user-pool-arn
    
      Resources:
        CognitoAuthorizer:
          Type: AWS::ApiGateway::Authorizer
          Properties:
            ...
            ProviderARNs:
              - !Ref UserPoolArnParameter
    
    完全な例は入手可能ですhere . この構文はサポートしていないSecureString 種類他に加えて文書化されているCloudFormation Parameter types はい.
    CloudFormationの2番目の展開オプションは、dynamic parameters このオプションはSecureString サービスの固定集合の型.CloudFormationの動的パラメータも特定のパラメータのバージョンをサポートします.以下のようである.{{resolve:ssm:/path/to/parameter:VERSION}}or{{resolve:ssm:/path/to/secure-parameter:VERSION}}The :VERSION サフィックスはどちらの場合もオプションで、最新版はデフォルトで自動的に選択されます.
    これらのオプションは、Serverlessなフレームワークのssm: 可変構文、CloudFormation構文はより安定していて、時間確認を配備するのを確実にして、Cloudformationスタックの雲側配備モデルでよりよく合います.
    CDK提供convenient functions 動的にこれらのCloudFormationオプションのいずれかを生成するSSMパラメータ.これらがCDKビルド時間ではなく時間ルックアップを展開していることは明らかではないかもしれませんが、合成CDK出力をチェックして、フードの下で何が起こっているかを確認できます.

    秘密管理人
    ここでのフォーカスは、SSMパラメータパラメータの秘密マネージャとは対照的です.原則は、すべての秘密マネージャを適用すると、より積極的に、秘密の値の最後のバインドに重点がイベントより重要ですので、定期的に回転される敏感な値を扱うことになりそうです!CloudFormation Dynamic ValuesはSecret Managerをサポートしていますが、CloudFormationパラメーターのサポートはありません.

    結論
    SSMパラメータを読むための親指のルールは、一般的に、できるだけ遅くそれらを読んでください.これにより、古い値を読み取る可能性が低くなり、妥協することができる記憶された秘密を持つことができる.コードを実行する前に値を調べる必要がある場合は、CloudFormationメソッドのいずれかを試してください.ビルド時の読み込みは可能な限り避けるべきです.