async-aws/ssm
Async AWS SSM client for PHP. Interact with AWS Systems Manager to read and manage Parameter Store values and other SSM operations using non-blocking, asynchronous HTTP calls—ideal for Laravel and modern PHP apps needing efficient AWS integrations.
Installation
composer require async-aws/ssm
Ensure aws/aws-sdk-php is also installed (dependency).
Basic Usage Initialize the SSM client in a Laravel service provider or config file:
use AsyncAws\Ssm\SsmClient;
$client = new SsmClient([
'region' => 'us-east-1',
'version' => 'latest',
'credentials' => [
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
],
]);
First Use Case: Fetching a Parameter
$parameter = $client->getParameter([
'Name' => '/myapp/db/username',
]);
$value = $parameter->getParameter()->getValue();
AsyncAws\Ssm\SsmClient and its methods (e.g., getParameter, putParameter).config or env helpers (e.g., via a facade or service binding).Parameter Retrieval
Use getParameter for read-only access to SSM parameters (e.g., secrets, configs):
$client->getParameter(['Name' => '/app/settings/timeout']);
Secure String Handling
For encrypted parameters (e.g., secrets), use getParameters with WithDecryption:
$response = $client->getParameters([
'Names' => ['/secrets/db/password'],
'WithDecryption' => true,
]);
Bulk Operations Fetch multiple parameters efficiently:
$response = $client->getParameters([
'Names' => ['/param1', '/param2'],
'WithDecryption' => true,
]);
Caching Layer Cache SSM responses in Laravel’s cache (e.g., Redis) to reduce AWS API calls:
$cacheKey = 'ssm_param_' . md5('/myapp/version');
$value = Cache::remember($cacheKey, now()->addHours(1), function () use ($client) {
return $client->getParameter(['Name' => '/myapp/version'])->getParameter()->getValue();
});
Laravel Facade: Bind the client to Laravel’s IoC container for easy access:
// In a service provider
$this->app->singleton(SsmClient::class, function ($app) {
return new SsmClient([
'region' => config('aws.region'),
'credentials' => $app['aws']->credentials(),
]);
});
Then inject SsmClient into controllers/services.
Environment Variables: Use SSM to replace .env secrets during deployment:
// In a deployment script
$envVars = $client->getParameters(['Names' => ['/env/APP_KEY', '/env/DB_PASSWORD']]);
foreach ($envVars->getParameters() as $param) {
putenv($param->getName() . '=' . $param->getValue());
}
Event-Driven Updates: Listen for SSM parameter changes (via AWS EventBridge) and trigger Laravel events or jobs to update cached values.
Permissions
Ensure the IAM role/user has ssm:GetParameter (and ssm:GetParameters for bulk) permissions. Missing permissions cause AccessDeniedException.
Parameter Store vs. Secrets Manager
WithDecryption for encrypted strings or migrate to AWS Secrets Manager for sensitive data.Caching Headers
SSM parameters may not support Cache-Control headers. Rely on Laravel’s cache or a custom TTL system.
Async Limitations The package is async-aws-compatible but may not support all Laravel sync workflows out of the box. Test async/await patterns if using async features.
Parameter Names
SSM paths are case-sensitive and must start with /. Invalid names throw InvalidParameterException.
$client = new SsmClient([...]);
$client->getHandler()->setDebug(true); // Logs raw API calls
use AsyncAws\Core\Exception\ThrottlingException;
try {
$client->getParameter([...]);
} catch (ThrottlingException $e) {
sleep(1); // Simple backoff; use a library like Guzzle’s retry middleware for production.
retry();
}
Parameter Versioning
Use getParameterHistory to audit changes:
$history = $client->getParameterHistory(['Name' => '/app/version']);
Tagging Parameters
Tag parameters for organizational purposes (e.g., Environment=production):
$client->addTagsToResource([
'ResourceType' => 'parameter',
'ResourceId' => '/app/settings',
'Tags' => ['Environment' => 'production'],
]);
Laravel Config Integration Dynamically load SSM parameters into Laravel’s config:
// In a config service provider
config(['app.version' => $client->getParameter(['Name' => '/app/version'])->getParameter()->getValue()]);
Error Handling Catch specific exceptions for graceful degradation:
use AsyncAws\Ssm\Exception\ParameterNotFoundException;
try {
$client->getParameter(['Name' => '/nonexistent']);
} catch (ParameterNotFoundException $e) {
Log::warning('SSM parameter not found', ['parameter' => '/nonexistent']);
return config('app.fallback_value');
}
Local Development
Use the aws-sdk-php localstack plugin or mock the client for testing:
// Mock example (using Mockery)
$mock = Mockery::mock(SsmClient::class);
$mock->shouldReceive('getParameter')
->once()
->andReturn((new GetParameterResponse())->withParameter(new Parameter('/test', 'value')));
How can I help you explore Laravel packages today?