2017-11-16 19 views
1

私はアプリケーションのさまざまなスタックでAWSラムダを使用する必要があるため、ラムダ関数を作成するための汎用のクラウド形成テンプレートを作成しました。このテンプレートは、nested stackとしてさらに使用するために、別のクラウド形成テンプレートに含めることができます。AWS Lambdaの動的環境変数(クラウドフォーメーションテンプレートを使用)

# Basics 
AWSTemplateFormatVersion: '2010-09-09' 
Description: AWS CloudFormation Template to create a lambda function for java 8 or nodejs 

# Parameters 
Parameters: 
    FunctionName: 
    Type: String 
    Description: Funciton Name 
    HandlerName: 
    Type: String 
    Description: Handler Name 
    FunctionCodeS3Bucket: 
    Type: String 
    Description: Name of s3 bucket where the function code is present 
    Default: my-deployment-bucket 
    FunctionCodeS3Key: 
    Type: String 
    Description: Function code present in s3 bucket 
    MemorySize: 
    Type: Number 
    Description: Memory size between 128 MB - 1536 MB and multiple of 64 
    MinValue: '128' 
    MaxValue: '1536' 
    Default: '128' 
    RoleARN: 
    Type: String 
    Description: Role ARN for this function 
    Runtime: 
    Type: String 
    Description: Runtime Environment name e.g nodejs, java8 
    AllowedPattern: ^(nodejs6.10|nodejs4.3|java8)$ 
    ConstraintDescription: must be a valid environment (nodejs6.10|nodejs4.3|java8) name. 
    Timeout: 
    Type: Number 
    Description: Timeout in seconds 
    Default: '3' 
    Env1: 
    Type: String 
    Description: Environment Variable with format Key|value 
    Default: '' 
    Env2: 
    Type: String 
    Description: Environment Variable with format Key|value 
    Default: '' 
    Env3: 
    Type: String 
    Description: Environment Variable with format Key|value 
    Default: '' 
    Env4: 
    Type: String 
    Description: Environment Variable with format Key|value 
    Default: '' 

# Conditions 
Conditions: 
    Env1Exist: !Not [ !Equals [!Ref Env1, '']] 
    Env2Exist: !Not [ !Equals [!Ref Env2, '']] 
    Env3Exist: !Not [ !Equals [!Ref Env3, '']] 
    Env4Exist: !Not [ !Equals [!Ref Env4, '']] 

# Resources 
Resources: 
    LambdaFunction: 
    Type: AWS::Lambda::Function 
    Properties: 
     Code: 
     S3Bucket: !Ref 'FunctionCodeS3Bucket' 
     S3Key: !Ref 'FunctionCodeS3Key' 
     Description: !Sub 'Lambda function for: ${FunctionName}' 
     Environment: 
     Variables: 
      'Fn::If': 
      - Env1Exist 
      - 
       - !Select [0, !Split ["|", !Ref Env1]]: !Select [1, !Split ["|", !Ref Env1]] 
       - 'Fn::If': 
       - Env2Exist 
       - !Select [0, !Split ["|", !Ref Env2]]: !Select [1, !Split ["|", !Ref Env2]] 
       - !Ref "AWS::NoValue" 
       - 'Fn::If': 
       - Env3Exist 
       - !Select [0, !Split ["|", !Ref Env3]]: !Select [1, !Split ["|", !Ref Env3]] 
       - !Ref "AWS::NoValue" 
       - 'Fn::If': 
       - Env4Exist 
       - !Select [0, !Split ["|", !Ref Env4]]: !Select [1, !Split ["|", !Ref Env4]] 
       - !Ref "AWS::NoValue" 
      - !Ref "AWS::NoValue" 
     FunctionName: !Ref 'FunctionName' 
     Handler: !Ref 'HandlerName' 
     MemorySize: !Ref 'MemorySize' 
     Role: !Ref 'RoleARN' 
     Runtime: !Ref 'Runtime' 
     Timeout: !Ref 'Timeout' 
Outputs: 
    LambdaFunctionARN: 
    Value: !GetAtt 'LambdaFunction.Arn' 

私は関数に環境変数を注入したい、それは以下のように親スタックから渡されます:私はこのスタックを展開する場合

# Resouces 
Resources: 
    # Lambda for search Function 
    ChildStackLambdaFunction: 
    Type: AWS::CloudFormation::Stack 
    Properties: 
     TemplateURL: <<REF_TO_ABOVE_LAMBDA_STACK.yml>> 
     Parameters: 
     FunctionName: test 
     HandlerName: 'index.handler' 
     FunctionCodeS3Bucket: <<BUCKET_NAME>> 
     FunctionCodeS3Key: <<FUNCTION_DEPLOYMENT_NAME>> 
     MemorySize: '256' 
     RoleARN: <<ROLE_ARN>> 
     Runtime: nodejs6.10 
     Timeout: '60' 
     Env1: !Sub 'AWS_REGION|${AWS::Region}' 

、私はエラーの下に取得しています。誰かが私にこれを解決するのを助けることができますか?キーと値のパラメータを渡す

Template format error: [/Resources/LambdaFunction/Type/Environment/Variables/Fn::If/1/0] map keys must be strings; received a map instead

だから、私はこれを達成するために非常に多くの方法を試してみましたhere

答えて

1

から呼ばれているが、私たちは、親スタックからネストされたラムダスタックへの動的なキーと値のペアを渡すことはできません。私はこの瞬間としてこれが不可能であるというAWSのサポートからの確認を受けました。

は、彼らは私が気に入った別の方法を提案し、実装し、その次のように述べた:

Pass the key: value pair as a JSON string and parse it appropriately in the lambda function.

Environment: 
    Variables: 
    Env1: '{"REGION": "REGION_VALUE", "ENDPOINT": "http://SOME_ENDPOINT"}' 

この提案は、JSON文字列を解析するために、プログラミング上のわずかなオーバーヘッドを持っていますが、現時点では私がします上記の問題の解決策としてこれをお勧めします。

関連する問題