Как правило, для доступа и дешифрования значений хранилища параметров AWS SSM требуются следующие 3 разрешения:
ssm:DescribeParameters
ssm:GetParameter
kms:Decrypt
-
Вот пример из реальной жизни, который разрешает доступ только к параметрам SSM, относящимся к моим лямбда-функциям (отличается по общему соглашению / шаблону именования) - он работает в следующих случаях:
- Значения SecureString шифруются с помощью ключа шифрования AWS SSM по умолчанию.
Все параметры используют следующее соглашение об именах
a./${app-name-or-app-namespace}/serverless/${lambda-function-name/then/whatever/else/you/want
b. ${lambda-function-name}
должен начинаться с sls-
Итак, допустим, у меня есть приложение с именем myCoolApp
и лямбда-функция с именем sls-myCoolLambdaFunction
.Возможно, я хочу сохранить значения конфигурации базы данных, такие как имя пользователя и пароль.
Я бы создал два параметра SSM:
/myCoolApp/serverless/sls-myCoolLambdaFunction/dev/database/username
(открытый текст)
/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:
/myCoolApp/serverless/sls-myCoolLambdaFunction/dev/database/username
(открытый текст)
/myCoolApp/serverless/sls-myCoolLambdaFunction/dev/database/password
(SecureString)
/myCoolApp/serverless/sls-myCoolLambdaFunction/prod/database/username
(открытый текст)
/myCoolApp/serverless/sls-myCoolLambdaFunction/prod/database/password
(SecureString)