bref/secrets-loader
Load AWS SSM Parameter Store secrets into environment variables at runtime when using Bref on AWS Lambda. Any env var value starting with bref-ssm: is automatically replaced with the corresponding SSM parameter value. Install via composer require bref/secrets-loader.
composer require bref/secrets-loader
serverless.yml:
Add bref-ssm: prefixed environment variables under provider.environment:
provider:
environment:
DB_PASSWORD: bref-ssm:/my-app/db-password
API_KEY: bref-ssm:/my-app/api-key
bref deploy to push changes to AWS Lambda. The package automatically replaces bref-ssm: placeholders with SSM values at runtime.Replace hardcoded Laravel .env secrets (e.g., DB_PASSWORD) with SSM-backed values in serverless.yml. Verify by checking Lambda’s environment variables in AWS Console > Lambda > Configuration > Environment variables or via CloudWatch logs:
// In a Laravel route or command
dd(env('DB_PASSWORD')); // Should show the SSM value
serverless.yml to define bref-ssm: variables.bref-ssm: in serverless.yml for secrets that Laravel reads via env() or config().# serverless.yml
environment:
APP_KEY: bref-ssm:/laravel/app-key
DB_CONNECTION: bref-ssm:/laravel/db-connection
// Laravel config/database.php
'password' => env('DB_PASSWORD'), // Resolved from SSM
config:cache:
php artisan config:clear
/dev/, /prod/).# serverless.yml (dev)
environment:
API_URL: bref-ssm:/my-app/dev/api-url
# serverless.yml (prod)
environment:
API_URL: bref-ssm:/my-app/prod/api-url
# Terraform example
resource "aws_ssm_parameter" "api_url_prod" {
name = "/my-app/prod/api-url"
type = "SecureString"
value = "https://prod.example.com"
}
serverless.yml for development/local testing.environment:
DB_PASSWORD: ${env:DB_PASSWORD, 'bref-ssm:/my-app/db-password'}
env-substituter.php) to replace bref-ssm: with .env values during local development.async-aws/ssm v2.x for non-blocking SSM calls (reduces cold-start latency).composer.json or serverless.yml uses the latest async-aws/ssm:
composer require async-aws/ssm:^2.0
environment:
FEATURE_NEW_CHECKOUT: bref-ssm:/my-app/features/new-checkout
if (env('FEATURE_NEW_CHECKOUT') === 'enabled') {
// Enable new feature
}
- name: Deploy to AWS Lambda
run: |
bref deploy --set-env=API_KEY=bref-ssm:/my-app/api-key
bref deploy.DB_PASSWORD via Secrets Manager, then update the SSM parameter.aws ssm put-parameter --name /my-app/db-password --value "new_password" --type SecureString
Bref\SecretsLoader\SecretsLoader::load() in a Lambda bootstrap file (e.g., bootstrap/app.php) to force-reload secrets:
require __DIR__.'/../../vendor/autoload.php';
(new \Bref\SecretsLoader\SecretsLoader())->load();
$app = require __DIR__.'/../bootstrap/app.php';
use Aws\Ssm\SsmClient;
$ssm = Mockery::mock(SsmClient::class);
$ssm->shouldReceive('getParameter')->andReturn(['Parameter' => ['Value' => 'mocked_value']]);
{
"Effect": "Allow",
"Action": "ssm:GetParameter",
"Resource": [
"arn:aws:ssm:REGION:ACCOUNT_ID:parameter/my-app/*",
"arn:aws:ssm:REGION:ACCOUNT_ID:parameter/shared/*"
]
}
# serverless.yml
functions:
myFunction:
provisionedConcurrency: 5
$cacheKey = 'ssm_my-app_db-password';
$value = cache($cacheKey) ?: \Bref\SecretsLoader\SecretsLoader::get('bref-ssm:/my-app/db-password');
cache()->put($cacheKey, $value, now()->addHours(1));
AccessDenied or ParameterNotFound.SecretsLoader errors.ssm:GetParameter for the SSM path.aws ssm get-parameter --name /my-app/db-password --region REGION
// bootstrap/app.php
$loader = new \Bref\SecretsLoader\SecretsLoader();
$loader->load(); // Blocks until secrets are loaded (avoids cold-start delay)
php artisan config:cache caches old SSM values.php artisan config:clear
env() directly instead of cached configs.SecureString parameters are encrypted but require KMS permissions.use Aws\Kms\KmsClient;
$kms = new KmsClient([...]);
$decrypted = $kms->dec
How can I help you explore Laravel packages today?