Как правило, для доступа к значениям хранилища параметров AWS SSM и их расшифровки требуются следующие 3 разрешения:
ssm:DescribeParameters
ssm:GetParameters
kms:Decrypt
-
Вот реальный пример, который разрешает доступ только к параметрам SSM, относящимся к моим лямбда-функциям (отличающимся общим соглашением / шаблоном именования) - он работает при следующих обстоятельствах:
- Значения SecureString зашифрованы с помощью ключа шифрования AWS SSM по умолчанию.
Все параметры используют следующее соглашение об именах
a. /${app-name-or-app-namespace}/serverless/${lambda-function-name/then/whatever/else/you/want
б.${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)
person
sudo soul
schedule
21.05.2019