2016-03-25 2 views
7

У меня есть (чрезвычайно простая, но отлично работающая) функция AWS лямбда, написанная на Python, но имеет встроенные учетные данные для подключения к: 1) внешнему веб-сервису 2) таблице DynamoDB.Как (правильно) использовать внешние учетные данные в функции AWS Lambda?

Что делает эта функция довольно простой: она отправляет логин к службе (с учетными данными №1), а затем сохраняет часть статуса ответа в таблицу DynamoDB (с учетными данными AWS № 2).

Эти соответствующие части функции:

h = httplib2.Http() 
auth = base64.encodestring('myuser' + ':' + 'mysecretpassword') 
(response, content) = h.request('https://vca.vmware.com/api/iam/login', 'POST', headers = {'Authorization':'Basic ' + auth,'Accept':'application/xml;version=5.7'}) 

, а затем

conn = boto.connect_dynamodb(aws_access_key_id='FAKEhhahahah',aws_secret_access_key='FAKEdhdhdudjjdjdjhdjjhdjdjjd') 

Как бы вы о чистке кода, не имея эти учетные данные внутри функции?

FYI эта функция должна запускаться каждые 5 минут (нет другого внешнего события, которое запускает ее).

ответ

8

В вашем примере вы имеете 2 типа учетных данных:

  1. AWS кредитки
  2. Без AWS кредитки

С AWS кредитки все просто: создать IAM роль , дайте ему разрешение dynamodb, и вам хорошо идти.

С, не AWS кредитки наиболее безопасный подход будет:

  1. Шифрование учетных данных авансом с использованием Kms службы. (kms.encrypt('foo'))
  2. После того, как вы зашифровали версию своей информации. Не стесняйтесь хранить его в любом месте. Простейшим способом было бы жесткое кодирование в лямбда.
  3. Добавить разрешение на лямбда IAM Роль для дешифрования информации с использованием ключа kms, который вы использовали на этапе 1.
  4. Затем каждый раз, когда вызывается лямбда, позвольте ему вызвать kms для дешифрования информации.
+0

Спасибо. Это действительно правильный подход.Присвоение правильной роли IAM функции лямбда для доступа к DynamoDB было тем, о чем я думал. «Нет AWS-Creds» часть проблемы была той, которую я не понял. Благодарю. – mreferre

4

Самый чистый способ - предоставить DynamoDB привилегии на роль LambdaExec. Ваш бото подключения становится:

conn = boto.connect_dynamodb() 

Или проверьте IAM политики, присоединенную к пользователю, чьи кредитки вы предоставляете для бото подключения. Выберите и выберите политики из этого списка и предоставите эти привилегии LambdaExec. Также обратите внимание на: Easy Authorization of AWS Lambda Functions

+0

Это правильный ответ на очистку учетных данных доступа dynamoDB. Для внешней веб-службы вам нужно будет хранить эти учетные данные где-то вроде S3 или DynamoDB. –

+0

Определенно используйте роли IAM, связанные с вашей лямбда-функцией, для всех учетных данных AWS. Для других секретов, необходимых во время выполнения, таких как пароли для внешних служб, я бы рекомендовал использовать KMS. Вы можете расшифровать данные в KMS на уровне модуля, поэтому вы платите только цену за время инициализации модуля (или когда ваша функция переходит из холода -> горячая). – garnaat

Смежные вопросы