Serverless Framework - Какие разрешения мне нужны для использования AWS SSM Parameter Store? - PullRequest
0 голосов
/ 21 мая 2019

Я открываю этот вопрос, потому что, похоже, нет документации по этому вопросу, поэтому я хотел бы предоставить ответ после большого количества времени, потраченного методом проб и ошибок.

В качестве фона, Serverless Framework [позволяет загружать как открытый текст, так и значения SecureString из хранилища параметров AWS SSM]. 1

Какие разрешения необходимы для доступа и загрузки этих SSMЗначения параметров хранилища при выполнении развертывания без сервера?

1 Ответ

1 голос
/ 21 мая 2019

Как правило, для доступа и дешифрования значений хранилища параметров AWS SSM требуются следующие 3 разрешения:

  1. ssm:DescribeParameters
  2. ssm:GetParameter
  3. kms:Decrypt

-

Вот пример из реальной жизни, который разрешает доступ только к параметрам SSM, относящимся к моим лямбда-функциям (отличается по общему соглашению / шаблону именования) - он работает в следующих случаях:

  1. Значения SecureString шифруются с помощью ключа шифрования AWS SSM по умолчанию.
  2. Все параметры используют следующее соглашение об именах

    a./${app-name-or-app-namespace}/serverless/${lambda-function-name/then/whatever/else/you/want

    b. ${lambda-function-name} должен начинаться с sls-

Итак, допустим, у меня есть приложение с именем myCoolApp и лямбда-функция с именем sls-myCoolLambdaFunction.Возможно, я хочу сохранить значения конфигурации базы данных, такие как имя пользователя и пароль.

Я бы создал два параметра SSM:

  1. /myCoolApp/serverless/sls-myCoolLambdaFunction/dev/database/username (открытый текст)

  2. /myCoolApp/serverless/sls-myCoolLambdaFunction/dev/database/password (SecureString)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:DescribeParameters"
            ],
            "Resource": [
                "arn:aws:ssm:${region-or-wildcard}:${aws-account-id-or-wildcard}:*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssm:GetParameter"
            ],
            "Resource": [
                "arn:aws:ssm:${region-or-wildcard}:${aws-account-id-or-wildcard}:parameter/myCoolApp/serverless/sls-*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt"
            ],
            "Resource": [
                "arn:aws:kms:*:${aws-account-id}:key/alias/aws/ssm"
            ]
        }
    ]
}

Тогда в моем файле serverless.yml я мог бы сослаться на эти два значения SSM как на переменные окружения уровня функции, например

environment:
      DATABASE_USERNAME: ${ssm:/myCoolApp/serverless/sls-myCoolLambdaFunction/dev/database/username}
      DATABASE_PASSWORD: ${ssm:/myCoolApp/serverless/sls-myCoolLambdaFunction/dev/database/password~true}

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

environment:
      DATABASE_USERNAME: ${ssm:/myCoolApp/serverless/sls-myCoolLambdaFunction/${self:provider.stage}/database/username}
      DATABASE_PASSWORD: ${ssm:/myCoolApp/serverless/sls-myCoolLambdaFunction/${self:provider.stage}/database/password~true}

В этом примере, если у меня было два этапа - dev & prod, возможно, я бы создал следующие параметры SSM:

  1. /myCoolApp/serverless/sls-myCoolLambdaFunction/dev/database/username (открытый текст)

  2. /myCoolApp/serverless/sls-myCoolLambdaFunction/dev/database/password (SecureString)

  3. /myCoolApp/serverless/sls-myCoolLambdaFunction/prod/database/username (открытый текст)

  4. /myCoolApp/serverless/sls-myCoolLambdaFunction/prod/database/password (SecureString)

...