无法为作为 AWS::CloudFormation::CustomResource 执行的 aws lambda 函数设置环境变量

Unable to set environment variable for aws lambda function executed as AWS::CloudFormation::CustomResource

我正在尝试设置环境变量,它通过我的 CustomResource 的 CloudFormation 模板 json 在运行时获取它的值。以便稍后它执行 python lambda,我可以读取 lambda 中的环境变量并处理一些数据。

我希望我的 python lambda 能够读取 os.environ

中的这个变量

以下是我的 CustomResource Cloudformation

"TriggerRedshiftSetupLambda": {
      "Type": "AWS::CloudFormation::CustomResource",
      "Version": 1.0,
      "Properties": {
       "Environment": {
          "Variables": {
            "AHost": {
                "Fn::GetAtt" : [ "A", "Endpoint.Address" ]
            },
            "APort": {
                "Fn::GetAtt" : [ "A", "Endpoint.Port" ]
            }
         }
        },
        "ServiceToken": {
          "Fn::GetAtt" : [ "ASetupLambda", "Arn" ]
        }
      }
    }

这是我使用变量的 lambda 代码

def lambda_handler(event, context):
    print(os.environ)
    print(os.environ['AHost'])

第一个打印语句打印了整个环境变量列表,但没有 'AHost'

的任何键/值对

我是不是做错了什么?如何通过customresource for lambda正确初始化环境变量?

似乎不​​支持通过自定义资源定义设置环境变量。您正在设置的是实际调用的属性部分(因此事件数据)。

因此,使用您的模板,您的配置应该可以在以下路径下访问。

event['ResourceProperties']['Environment']['Variables']['AHost']

如上面@jens 所述,无法使用 CustomResource CloudFormation 在 os.environ 下设置环境变量。

相反,Lambda CloudFormation 需要定义这些值 -

"RedshiftSetupLambda": {
  "Type": "AWS::Lambda::Function",
  "Properties": {
    "Code": {
      "S3Bucket": { "Fn::Sub": "XYZ-${Branch}" },
      "S3Key": { "Fn::Sub": "XYZ-${Commit}.zip" }
    },
    "Description": "Setup Lambda",
    "FunctionName": { "Fn::Sub": "${BlockId}-setup-${Branch}" },
    "Handler": "setup.lambda_handler",
    "KmsKeyArn": {
      "Fn::ImportValue": {
        "Fn::Sub": "${BlockId}-Common-RolesKeys-${Branch}-KMSKeyArn"
      }
    },
    "Role": {
      "Fn::ImportValue": {
        "Fn::Sub": "${BlockId}-Common-RolesKeys-${Branch}-LambdaIAMRoleArn"
      }
    },
    "Runtime": "python2.7",
    "Timeout": 30,
    "VpcConfig": {
      "SecurityGroupIds": [ {"Ref": "SecurityGroup"} ],
      "SubnetIds": [
        { "Fn::ImportValue": "VPCCreate-PrivateSubnet1Id" },
        { "Fn::ImportValue": "VPCCreate-PrivateSubnet2Id" },
        { "Fn::ImportValue": "VPCCreate-PrivateSubnet3Id" }
      ]
    },
    "Environment": {
      "Variables": {
        "DB_USERNAME": {
          "Ref": "MasterUsername"
        },
        "AHOST": {
          "Fn::GetAtt": ["RedshiftCluster", "Endpoint.Address"]
        },
        "APORT": {
          "Fn::GetAtt": ["RedshiftCluster", "Endpoint.Port"]
        },
        "CLUSTER_IDENTIFIER": {
          "Ref": "RedshiftCluster"
        }
      }
    }
  }
}

可以这样访问它们:

print(os.environ['AHOST'])