I'm trying to get my symfony2 app running on elastic beanstalk. I'm trying to get environment variables (RDS_USER, RDS_PASSWORD, etc...) in my parameters.yml in order to get the database credentials.
The thing is symfony2 needs the environment variables to be prefixed by SYMFONY__
so I could I get these variables without prefixes ?
My apologies, because this question has been answered already (and I found the answers very helpful, thanks @tomas.pecserke and @dubrox!), but I dug around a little more and I discovered an alternative solution that I think is worth adding for posterity.
In a nutshell, you can add an env-map
to incenteev-parameters
in composer.json
to map available environmental variables to parameters; e.g:
"extra": {
"incenteev-parameters": {
"file": "app/config/parameters.yml",
"env-map": {
"database_host": "RDS_HOSTNAME",
"database_port": "RDS_PORT",
"database_name": "RDS_DB_NAME",
"database_user": "RDS_USERNAME",
"database_pass": "RDS_PASSWORD"
}
}
}
As documented in Using environment variables to set the parameters:
For your prod environment, using an interactive prompt may not be possible when deploying. In this case, you can rely on environment variables to provide the parameters. This is achieved by providing a map between environment variables and the parameters they should fill [...]
and
If an environment variable is set, its value will always replace the value set in the existing parameters file.
I just tested this on a fresh EB deployment and it worked a treat. You can test this with a local deployment, like so:
rm app/config/parameters.yml
export RDS_HOSTNAME=foo \
RDS_PORT=3306 \
RDS_DB_NAME=bar \
RDS_USERNAME=baz \
RDS_PASSWORD=quux
composer install
The interactive prompt will skip all database_*
parameters, and they will be automatically populated by the environmental values. Deployment sanity. Awesome :)
You can load a php file as a resource:
# app/config/config.yml
imports:
- { resource: parameters.php }
And from there it's easy:
// app/config/parameters.php
$container->setParameter('rds.user', getenv('RDS_USER'));
// if set via apache SetEnv use:
//$container->setParameter('rds.user', apache_getenv('RDS_USER'));
UPDATE:
Since the original answer, a new solution was provided (thanks to @darragh-enright for pointing it out) using env-map
feature of incenteev-parameters
component in composer.json
.
"extra": {
"incenteev-parameters": {
"file": "app/config/parameters.yml",
"env-map": {
"database_host": "RDS_HOSTNAME",
"database_port": "RDS_PORT",
"database_name": "RDS_DB_NAME",
"database_user": "RDS_USERNAME",
"database_pass": "RDS_PASSWORD"
}
}
}
Any mapped parameter would be overwritten by value from environment variable. For more info on env-map
see documentation.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With