Как шифровать переменные среды для Lambda через CLI?

введите описание изображения здесь

При создании функции Lambda очень сложно зашифровать переменную среды через консоль GUI. Я просто вводил пары значений ключа, затем открывал помощник шифрования и вводил ARN моего ключа KMS. Это позволяет мне зашифровать значение, поэтому оно зашифровывается до его отправки, как показано на изображении выше.

То, что я пытаюсь выполнить, это то же самое, но предполагая, что вы используете эту функцию Lamba не в консоли GUI, а через шаблон CloudFormation, который развертывается в CLI .

Вот как я указываю соответствующие параметры в шаблоне CloudFormation:

"EnvironmentVariable" : {
      "Type" : "String",
      "Default" : "test",
      "Description" : "Environment Variable"
    },
    "KmsKeyArn" : {
      "Type" : "String",
      "Description" : "KMS Key ARN if environment variables are encrypted"
    },

Вот как я ссылаюсь на эти параметры в ресурсе Lambda, в разделе «Ресурсы» шаблона:

"Environment" : {
   "Variables" : {
     "SomeVariable": {
       "Ref" : "EnvironmentVariable"
     }  
   }
 },
 "KmsKeyArn" : { "Ref" : "KmsKeyArn" },

И вот как я развертываю этот шаблон в CLI (при изменении всех ARN и других значений для защиты конфиденциальности, но сохраняя их структуру):

aws cloudformation deploy --template-файл lambda-template.json --stack-name "CLI-lambda-stack" - parameter-overrides S3BucketName = "theBucket" S3FileLocation = "lambda_function.zip" S3ObjectVersion = "ZuB0eueEgh2yh5q00.DiykLNudujdsc5" DeadLetterArn = "arn: aws: sns: us-west-2: 526598937246: CloudFormationTests" EnvironmentVariable = "тестирование" KmsKeyArn = "arn: aws: kms: us-west-2: 227866537246: key / b24e7c79-a14d-4a3e-b848- 165115c86210 "HandlerFunctionName =" lambda_function.lambda_handler "MemorySize =" 128 "Role =" arn: aws: iam :: 507845137246: role / serverless-test-default-us-east-1-lambdaRole "FuncName =" myCLILambda "

После запуска этого в CLI я не получаю никаких ошибок, но когда я открываю функцию Lambda в консоли для проверки результатов, я вижу что-то вроде этого:

введите описание изображения здесь

Где я иду не так? Спасибо за любые идеи.

Всего 2 ответа


  1. Создайте ключ KMS, если у вас его еще нет (AWS> IAM> Шифрование> Создать новый ключ> Дайте псевдоним). Получите KeyId.
  2. Шифруйте свои переменные через KMS. Пример:

$ aws kms encrypt --key-id $KEY_ID --plaintext secretpassword --output text --query CiphertextBlob

AQICAHjZ + JlI8KKmiVc ++ NhnBcO0xX3LFAaCfsjH8Yjig3Yr2AFPIyKCp3XVOEDlbiTMWiejAAAAbDBqBgkqhkiG9w0BBwagXTBbAgEAMFYGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMhai9vkA2KdU5gd + qAgEQgCnWW4F3fb7pTwmA2ppskJhUl0dJGEXIE5oDCr3ZsH7TlN5X381juPg0LA ==

Храните его в своем шаблоне CF, как это

"environment_variables": {
        "SECRET_DATA": "AQICAHjZ+JlI8KKmiVc++NhnBcO0xX3LFAaCfsjH8Yjig3Yr2AFPIyKCp3XVOEDlbiTMWiejAAAAbDBqBgkqhkiG9w0BBwagXTBbAgEAMFYGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMhai9vkA2KdU5gd+qAgEQgCnWW4F3fb7pTwmA2ppskJhUl0dJGEXIE5oDCr3ZsH7TlN5X381juPg0LA=="
       }

3.Decrypt внутри вашей лямбда-функции

kms = boto3.client('kms')
response = kms.decrypt(CiphertextBlob=os.environ['SECRET_DATA'].decode('base64'))
secret_data = response['Plaintext']
secret_data

Или воспользуйтесь этой опцией: https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-paramstore-about.html#sysman-paramstore-securestring


Подводя итог нашим комментариям:

Существует два типа шифрования: в пути и в состоянии покоя . Когда вы настраиваете свойство KmsKeyArn в CloudFormation, вы настраиваете конфигурацию «в состоянии покоя» на AWS Lambda, что заставляет AWS шифровать информацию на своих серверах перед хранением. Вы никогда не увидите, что это происходит, и вы не видите зашифрованное значение.

Шифрование «в пути» - это тот, который вы видите на консоли. Как говорится, GUI имеет помощников для шифрования вашего текста. Это сделает текст зашифрованным даже для вас, и они изменят его на *****. Чтобы использовать эту переменную в вашей функции, вам нужно написать код, который расшифрует значение. Пример: Как использовать зашифрованные переменные окружения в AWS Lambda? ,

Для достижения тех же результатов из GUI с использованием CLI вам необходимо вручную зашифровать свои переменные перед вызовом команды aws cloudformation deploy .


Есть идеи?

10000