2017-12-14 17 views
1

ECSインフラストラクチャを作成するときは、Task DefinitionsをCloudFormationと記述します。環境変数をパラメータとしてテンプレートに動的に渡すことができるようにしたい。ドキュメントによると、EnvironmentにはKeyValuePairタイプがありますが、CloudFormationパラメータにはこのタイプがありません。 環境変数をテンプレートにハードコードすることはできません。このテンプレートはネストされたスタックとして使用されるため、環境変数は内部で動的に渡されるためです。Cloudform KeyValuePairパラメータとしてのリスト

私が今までに見た唯一の方法は、すべての引数をCommaDelimitedListとして渡して、何とか構文解析してCloudFormation functionsを使用してマップすることです。私はFn ::キーと値のすべてのエンティティを分割できますが、CloudFormationでKeyValuePairの配列を動的に構築する方法はありますか?

もっと簡単な方法がありますが、何か不足していますか?事前に感謝の意を表します。

+0

環境からキーペアを消費するクライアント/サービスはありますか?いくつのキーペアをパラメータとして注入する必要がありますか? –

+0

@RodrigoMでは、キーと値のペアの量は動的ですが、私たちの場合、最大20の環境変数です。これらの環境変数は、これがあなたが求めているものなら、Dockerコンテナに渡されます。 – Ivan

+0

私はちょうどプロセスのどこで参照されているのだろうかと思っていた。 Dockerファイルまたはランタイムアプリケーションで参照されている値はありますか?どちらも? –

答えて

0

EC2パラメータストアを使用して、CloudFormationでサポートされ、ECS環境と統合できる安全なキーと値のペアを作成することを検討してください。

AWS Systems Manager Parameter Store

AWSシステムマネージャのパラメータStoreは、構成データの管理と秘密管理のための安全な、階層 ストレージを提供します。 には、パスワード、データベース文字列、およびライセンスコード などのデータをパラメータ値として格納できます。値をプレーンテキストまたは暗号化された データとして格納できます。パラメーターを作成したときに指定した の一意の名前を使用して値を参照できます。高度にスケーラブルで利用可能な と耐久性のあるパラメータストアは、AWSクラウドによってサポートされています。パラメータ 店舗は追加料金なしで提供されます。

パラメータStoreはアプリケーションの秘密を格納するための優れたセキュリティ機能を有しているが、また、などの公開鍵、環境設定、ライセンスコード、

そして、それが直接サポートされているように、非センシティブ・アプリケーションの文字列を格納するために使用することができ

CloudFormationにより、ECSがアクセスできるアプリケーション構成文字列を簡単に取得、保存、管理することができます。 このテンプレートは、コンソールまたはCLIを経由してスタックの作成時にパラメータストアキー値を提供することができます:

Description: Simple SSM parameter example 
Parameters: 
    pSMTPServer: 
    Description: SMTP Server URL eg [email-smtp.us-east-1.amazonaws.com]:587 
    Type: String 
    NoEcho: false 
    SMTPServer: 
    Type: AWS::SSM::Parameter 
    Properties: 
     Name: my-smtp-server 
     Type: String 
     Value: !Ref pSMTPServer 

どれAWSランタイム環境(EC2、ECS、ラムダ)は簡単に安全に値を取得することができます。コンソール側からは、パラメータのバージョン履歴を保持する優れたパラメータマネージャインターフェイスがあります。許可が標準IAMポリシーの構文を使用して制御されているように、その、IAMでintergated:

{ 
    "Action": [ 
     "ssm:GetParameterHistory", 
     "ssm:GetParameter", 
     "ssm:GetParameters", 
     "ssm:GetParametersByPath" 
    ], 
    "Resource": [ 
     "arn:aws:ssm:us-west-2:555513456471:parameter/smtp-server" 
    ], 
    "Effect": "Allow" 
}, 
{ 
    "Action": [ 
     "kms:Decrypt" 
    ], 
    "Resource": [ 
     "arn:aws:kms:us-west-2:555513456471:key/36235f94-19b5-4649-84e0-978f52242aa0a" 
    ], 
    "Effect": "Allow" 
} 

最後に、このblog articleは、実行時にDockerfileに権限を読み込むための手法を示しています。 AWSパラメータストアを使用してDockerで環境変数を処理する安全な方法を提案しています。参考のために、私はここに彼らのDockerfile含む午前:

FROM grafana/grafana:master 

RUN curl -L -o /bin/aws-env https://github.com/Droplr/aws-env/raw/master/bin/aws-env-linux-amd64 && \ 
    chmod +x /bin/aws-env 

ENTRYPOINT ["/bin/bash", "-c", "eval $(/bin/aws-env) && /run.sh"] 

その呼び出しでは、各パラメータは、コンテナ内の環境変数として利用可能です。あなたは、環境変数からパラメータを読み込むためにラッパーが必要な場合とそうでない場合があります。

+0

テンプレートのパラメータリストをテンプレートに挿入するという問題は本当に解決されません。私は変数の値をenv変数に渡すだけでなく、キーも渡す必要があります。 – Ivan

+0

もちろん、テンプレートには20個のパラメータを含めることができます。それはあなたが意味することですか?どのようなタイプのキーですか?一般的なパラメータストアなので、何かを格納できます。他のタイプのデータの中にもsshキーを格納するために使用します。 –

+0

CloudFieldで必要とされているTaskDefinition ContainerDefinition KeyValueペアと機能的に同等です。 SSMパラメータは現在CloudFormationにあります。 Fn :: GetAtt(パラメータ、 'value')を使用すると、他のスタックの値を参照することもできます。あなたの与えられた要件に合わなければならないようですね。 –

関連する問題