Невозможно установить переменную среды для лямбда-функции aws, выполняемой как AWS :: CloudFormation :: CustomResource - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь установить переменную среды, которая принимает ее значение во время выполнения через мой шаблон CloudFormation json для CustomResource. Чтобы потом он выполнял лямбда-Python, и я могу прочитать переменную окружения в лямбда-выражении и обработать некоторые данные.

Я хочу, чтобы моя python-лямбда могла читать эту переменную внутри os.environ

Ниже приводится моя Cloudformation для CustomResource

"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" ]
        }
      }
    }

Вот мой лямбда-код с использованием переменной

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

1-й оператор печати печатает весь список переменных среды, но не имеет пары ключ / значение для 'AHost'

Я что-то не так делаю? Как правильно инициализировать переменные среды через customresource для lambda?

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Как сказано выше @jens, невозможно установить переменные окружения в os.environ с помощью CustomResource CloudFormation.

Вместо этого 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'])
0 голосов
/ 07 мая 2018

Задание переменных среды с помощью пользовательского определения ресурса не поддерживается. То, что вы устанавливаете, это раздел свойств для фактического вызова (поэтому данные о событии).

Итак, используя ваш шаблон, ваша конфигурация должна быть доступна по следующему пути.

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