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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法为执行AWS :: CloudFormation :: CustomResource的aws lambda函数设置环境变量相关的知识,希望对你有一定的参考价值。

我试图通过我的CloudFormation模板json为CustomResource设置环境变量,该变量在运行时获取它的值。所以稍后它会执行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'])

第一个print语句打印整个环境变量列表,但没有'AHost'的任何键/值对

难道我做错了什么?如何通过lambda的customresource正确初始化环境变量?

答案

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

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

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'])

以上是关于无法为执行AWS :: CloudFormation :: CustomResource的aws lambda函数设置环境变量的主要内容,如果未能解决你的问题,请参考以下文章

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

AWS 无法对 cli 执行操作

AWS:无法执行二进制文件

将 Docker 部署到 AWS Elastic Beanstalk:无法执行命令“docker pull maven”

AWS Elastic Beanstalk - PHP 脚本在部署新版本后无法执行

AWS Glue 作业失败:调用 o71.getDynamicFrame..SdkClientException 时发生错误:无法执行 HTTP 请求:Connect .s3..connect 超时