0Pricing
AWS Solutions Architect · Урок

Secrets Manager и Parameter Store

Автоматически обновляйте учётные данные базы данных с помощью Secrets Manager, храните неконфиденциальную конфигурацию в Parameter Store и интегрируйте оба сервиса с Lambda и ECS.

«Secrets Manager и Parameter Store» — бесплатный урок AWS Solutions Architect на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AWS Solutions Architect, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AWS Solutions Architect содержит 4 уроков всего.

Проблема секретов в коде

Распространённый и опасный антишаблон — хранить секреты (пароли баз данных, ключи API, токены OAuth) в исходном коде приложения, переменных среды или конфигурационных файлах, добавленных в систему управления версиями. Если такие репозитории становятся доступными — случайно публикуются или к ним получает доступ злоумышленник, — все секреты немедленно оказываются скомпрометированы. AWS предоставляет два управляемых сервиса, позволяющих устранить эту проблему: AWS Secrets Manager для учётных данных, требующих автоматической ротации, и AWS Systems Manager Parameter Store для значений конфигурации и секретов без ротации.

# Anti-pattern: secrets in code (NEVER do this)
# db_password = 'supersecret123'
# api_key = 'sk-abc123def456'

# Best practice: retrieve at runtime
import boto3

client = boto3.client('secretsmanager', region_name='us-east-1')
response = client.get_secret_value(SecretId='prod/myapp/db-password')
password = response['SecretString']  # fresh value, always current

Обзор AWS Secrets Manager

AWS Secrets Manager — это управляемый сервис для хранения, получения и автоматической ротации секретов. Он шифрует все секреты с помощью KMS (по умолчанию используя управляемый AWS ключ или ваш CMK). В секретах можно хранить любые структурированные данные в виде строки JSON с парами ключ-значение. AWS Secrets Manager стоит 0,40 доллара за секрет в месяц плюс 0,05 доллара за каждые 10 000 вызовов API. Главное отличие от Parameter Store: встроенная автоматическая ротация для RDS, Redshift, DocumentDB и пользовательских секретов с помощью функций ротации Lambda — при ротации изменять приложения не требуется.

# Create a secret in Secrets Manager
aws secretsmanager create-secret \
  --name 'prod/myapp/database' \
  --description 'Production MySQL credentials' \
  --secret-string '{"username":"admin","password":"changeme123","host":"mydb.rds.amazonaws.com","port":3306,"dbname":"orders"}'

# Retrieve the secret (by application)
aws secretsmanager get-secret-value \
  --secret-id 'prod/myapp/database' \
  --query 'SecretString' \
  --output text | python3 -c 'import sys,json; s=json.load(sys.stdin); print(s["password"])'

Автоматическая ротация с помощью Secrets Manager

Автоматическая ротация — самая мощная функция Secrets Manager. Для баз данных RDS Secrets Manager автоматически изменяет пароли следующим образом: 1) создаёт новый пароль; 2) обновляет пароль пользователя базы данных в RDS; 3) обновляет секрет, сохраняя новый пароль; 4) проверяет работоспособность новых учётных данных. Всё это происходит во время работы приложения — без простоя и ручного вмешательства. Приложения всегда вызывают get-secret-value, чтобы получить текущий пароль, поэтому автоматически используют обновлённые учётные данные.

# Enable automatic rotation for RDS secret
aws secretsmanager rotate-secret \
  --secret-id 'prod/myapp/database' \
  --rotation-rules AutomaticallyAfterDays=30 \
  --rotation-lambda-arn arn:aws:lambda:us-east-1:123:function:SecretsManagerRDSMySQLRotationSingleUser

# AWS provides pre-built rotation Lambda functions for:
# - RDS MySQL/PostgreSQL/MariaDB/Oracle/SQL Server
# - DocumentDB
# - Redshift
# - Custom: write your own Lambda for other services

# Application code: always call GetSecretValue, never cache long-term

Локальное кэширование секретов

Обращаться к Secrets Manager при каждом запросе к базе данных было бы дорого и медленно. Рекомендуется кэшировать секрет локально в памяти на короткий срок. AWS предоставляет официальные клиенты кэширования Secrets Manager для Java и Python, которые кэшируют секреты на настраиваемый TTL. Когда срок действия кэша истекает, клиент повторно получает секрет из Secrets Manager. Если приложение получает ошибку аутентификации, означающую, что пароль был изменён, оно немедленно обновляет кэш и повторяет запрос. Этот подход обеспечивает высокую производительность и актуальность данных, не создавая чрезмерную нагрузку на API Secrets Manager.

# Python: Secrets Manager caching client
# pip install aws-secretsmanager-caching

from botocore.session import get_session
from aws_secretsmanager_caching import SecretCache, SecretCacheConfig

client = get_session().create_client('secretsmanager')
cache = SecretCache(
    config=SecretCacheConfig(secret_refresh_interval=3600),  # cache 1 hour
    client=client
)

# Returns cached value unless refresh interval expired
secret = cache.get_secret_string('prod/myapp/database')

AWS Systems Manager Parameter Store

AWS Systems Manager (SSM) Parameter Store — бесплатное (для стандартных параметров) иерархическое хранилище пар ключ-значение для данных конфигурации и секретов. Оно поддерживает типы параметров String, StringList и SecureString. SecureString шифрует значения с помощью KMS. В отличие от Secrets Manager, Parameter Store НЕ поддерживает автоматическую ротацию — он предназначен для значений конфигурации, которые меняются нечасто. Стандартные параметры бесплатны и могут хранить до 4 КБ. Расширенные параметры поддерживают значения большего размера (до 8 КБ), политики параметров (срок действия и напоминания о ротации) и стоят 0,05 доллара за параметр в месяц.

# Create Parameter Store parameters
aws ssm put-parameter \
  --name '/prod/myapp/db-host' \
  --value 'mydb.cluster-abc.us-east-1.rds.amazonaws.com' \
  --type String

aws ssm put-parameter \
  --name '/prod/myapp/db-password' \
  --value 'mysecretpassword' \
  --type SecureString \
  --key-id alias/my-kms-key

# Retrieve parameter
aws ssm get-parameter \
  --name '/prod/myapp/db-password' \
  --with-decryption \
  --query 'Parameter.Value' --output text

Иерархия Parameter Store и IAM

Организуйте значения в Parameter Store с помощью иерархической структуры путей, отражающей структуру вашей среды и архитектуру приложения. Это позволяет создавать детализированные политики IAM, предоставляющие доступ к параметрам по префиксу пути. Например, предоставьте функции Lambda доступ только к параметрам в разделе /prod/payment-service/ — она не сможет получить доступ к параметрам других сервисов. Этот принцип минимальных привилегий для конфигурации не позволяет одному скомпрометированному сервису читать секреты другого сервиса.

# Parameter hierarchy
/prod/payment-service/db-password
/prod/payment-service/stripe-api-key
/prod/order-service/db-password
/prod/order-service/redis-url
/staging/payment-service/db-password

# IAM policy: payment-service Lambda can ONLY read its params
{
  'Effect': 'Allow',
  'Action': ['ssm:GetParameter', 'ssm:GetParameters', 'ssm:GetParametersByPath'],
  'Resource': 'arn:aws:ssm:us-east-1:123:parameter/prod/payment-service/*'
}

# Get all parameters for an app at once
aws ssm get-parameters-by-path \
  --path '/prod/payment-service/' \
  --with-decryption --recursive

Secrets Manager и Parameter Store: когда что использовать

Выбирайте один из двух сервисов в зависимости от ваших требований: используйте Secrets Manager, если вам нужна автоматическая ротация секретов, вы храните учётные данные базы данных, секрет необходимо предоставлять нескольким аккаунтам AWS или требования соответствия стандартам предусматривают документированные политики ротации. Используйте Parameter Store, если вам нужны значения конфигурации (не секреты), вы хотите бесплатное решение для простого хранения пар ключ-значение, вам нужна иерархическая конфигурация с контролем доступа по путям или требуется хранить историю версий параметров. Во многих архитектурах используются оба сервиса: Parameter Store — для конфигурации, Secrets Manager — для учётных данных.

# Usage comparison:
# Secrets Manager:
#   Cost: $0.40/secret/month
#   Rotation: Automatic (RDS, custom Lambda)
#   Cross-account: Yes
#   Best for: Database passwords, API keys, OAuth tokens

# Parameter Store:
#   Cost: Free (standard) / $0.05/month (advanced)
#   Rotation: Manual only
#   Cross-account: No (use Secrets Manager)
#   Best for: Config values, feature flags, non-rotating secrets

Интеграция с Lambda и ECS

Функции Lambda и задачи ECS должны получать секреты при запуске, а не при каждом вызове. Для Lambda: получайте секреты в коде инициализации (вне функции обработчика) и кэшируйте их в глобальных переменных — среда выполнения Lambda сохраняется между вызовами, поэтому секреты запрашиваются только один раз за время существования каждой среды. Для ECS: используйте поле secrets в определении задачи, чтобы передавать значения Secrets Manager или SecureString из Parameter Store в качестве переменных среды — ECS получает их и передаёт при запуске задачи, не требуя изменений в коде приложения.

# ECS task definition: inject secret as environment variable
{
  'containerDefinitions': [{
    'name': 'api',
    'image': 'my-api:latest',
    'secrets': [
      {
        'name': 'DB_PASSWORD',
        'valueFrom': 'arn:aws:secretsmanager:us-east-1:123:secret:prod/myapp/database:password::'
      },
      {
        'name': 'API_KEY',
        'valueFrom': '/prod/myapp/api-key'
      }
    ]
  }]
}
# Application reads DB_PASSWORD from env var
# ECS injects the current secret value at task start

Parameter Store для идентификаторов AMI EC2

Практическое, но часто упускаемое применение Parameter Store — хранение идентификаторов AMI и других ссылок, используемых при развёртывании. Вместо жёсткого указания идентификаторов AMI в шаблонах CloudFormation, которые устаревают после выпуска новых AMI, ссылайтесь на значение в Parameter Store. Ваш конвейер CI/CD обновляет идентификатор AMI в Parameter Store каждый раз, когда создаётся новый эталонный AMI. CloudFormation считывает последний идентификатор AMI из Parameter Store во время развёртывания. AWS также публикует идентификаторы последних AMI Amazon Linux в общедоступных путях Parameter Store, на которые можно ссылаться напрямую.

# Get AWS public AMI ID from Parameter Store
aws ssm get-parameter \
  --name '/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64' \
  --query 'Parameter.Value' --output text

# CloudFormation: reference public AMI parameter
Parameters:
  LatestAmiId:
    Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
    Default: '/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64'

Resources:
  MyEC2:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref LatestAmiId

Аудит и соответствие требованиям для секретов

Для управления секретами необходимо знать, кто и когда получал к ним доступ. AWS CloudTrail записывает каждый вызов API к Secrets Manager и Parameter Store: GetSecretValue, PutParameter, GetParameter. Это предоставляет полный аудиторский журнал для подтверждения соответствия требованиям. Используйте оповещения CloudWatch на основе метрик CloudTrail, чтобы получать уведомления о доступе к секретам, отклоняющемся от обычных шаблонов, — например, если к секрету рабочей среды обращаются от необычного субъекта IAM или с IP-адреса, отсутствующего в известном диапазоне, создайте оповещение для расследования.

# CloudTrail metric filter: alert on unexpected secret access
aws logs put-metric-filter \
  --log-group-name CloudTrail/management-events \
  --filter-name 'SecretAccessOutsideHours' \
  --filter-pattern '{ $.eventSource = "secretsmanager.amazonaws.com" && $.eventName = "GetSecretValue" && $.userAgent != "lambda.amazonaws.com" }' \
  --metric-transformations \
    metricName=UnexpectedSecretAccess,metricNamespace=Security,metricValue=1

# Then create CloudWatch alarm on this metric
# Alert fires when non-Lambda principal accesses secrets

Совместное использование секретов между аккаунтами

В архитектурах с несколькими аккаунтами приложениям в одном аккаунте иногда требуются секреты, управляемые в другом аккаунте (например, центральный аккаунт Security управляет всеми паролями RDS). Политики ресурсов Secrets Manager разрешают доступ между аккаунтами. Настройте политику на основе ресурсов для секрета, предоставив роли в использующем аккаунте право вызывать GetSecretValue. Роль использующего аккаунта также должна иметь политику IAM, разрешающую вызовы для ARN секрета. Политики ключа KMS также должны предоставлять использующему аккаунту доступ к CMK, применяемому для шифрования секрета.

# Secret resource policy: allow cross-account access
aws secretsmanager put-resource-policy \
  --secret-id 'prod/shared/rds-password' \
  --resource-policy '{
    "Statement": [{
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::999999999999:role/AppRole"
      },
      "Action": "secretsmanager:GetSecretValue",
      "Resource": "*"
    }]
  }'

# KMS key policy must also allow account 999999999999
# IAM policy in 999999999999 must allow GetSecretValue on ARN

Быстрая проверка

Проверьте своё понимание концепций AWS Solutions Architect (SAA-C03) из этого урока.

Итоги урока

В этом уроке вы узнали следующее: Secrets Manager обеспечивает автоматическую ротацию учётных данных баз данных и API-ключей и является предпочтительным выбором для секретов, которые необходимо ротировать; Parameter Store предоставляет бесплатное иерархическое хранилище конфигурации с управлением доступом IAM на основе путей; ECS и Lambda могут передавать секреты в качестве переменных среды без изменений в коде приложения. CloudTrail предоставляет аудиторские журналы для всех обращений к секретам. Далее мы рассмотрим WAF, Shield и Network Firewall.

Часто задаваемые вопросы

Урок «Secrets Manager и Parameter Store» бесплатный?

Да — полный текст урока «Secrets Manager и Parameter Store» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AWS Solutions Architect, подпишись на CoddyKit PRO. Курс AWS Solutions Architect содержит 4 уроков всего.

Чему я научусь в уроке «Secrets Manager и Parameter Store»?

Автоматически обновляйте учётные данные базы данных с помощью Secrets Manager, храните неконфиденциальную конфигурацию в Parameter Store и интегрируйте оба сервиса с Lambda и ECS. Ты практикуешь AWS Solutions Architect с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать AWS Solutions Architect?

Предыдущий опыт не требуется. AWS Solutions Architect на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Secrets Manager и Parameter Store»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке AWS Solutions Architect?

Да. Каждый урок AWS Solutions Architect включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. KMS, ACM и шаблоны шифрования
  2. GuardDuty, Inspector и Macie
  3. Secrets Manager и Parameter Store
  4. WAF, Shield и Network Firewall
← Назад к AWS Solutions Architect