#!/usr/bin/env bash cd set -e #################### # parameters #################### # dev-env-db-subnet-group: RDS subnet group of subnets # subnet-35760642: subnet for VPC 'vpc-89b6fbec' in 'us-west-2a' # subnet-ef7d2f8a: subnet for VPC 'vpc-89b6fbec' in 'us-west-2b' # subnet-a9901af0: subnet for VPC 'vpc-89b6fbec' in 'us-west-2c' db_subnet_group_name="dev-env-db-subnet-group" # AWS account number not returned by `aws rds describe-db-instances` aws_account_number="837173812892" # region not returned by `aws rds describe-db-instances` db_instance_region="us-west-2" # db.t2.micro: the cheapest type db_instance_class="db.t2.micro" # rds_snapshot if [ "$1" == "" ]; then echo "snapshot ID (e.g. 'rds:instagis2015-2015-09-23-07-23)' is required as first argument" exit 1 fi rds_snapshot=$1 # http://www.howtogeek.com/howto/30184/10-ways-to-generate-a-random-password-from-the-command-line/ rand_hex_value=$(< /dev/urandom tr -dc a-f0-9 | head -c5) rds_instance_id="ig-dev-$rand_hex_value" master_username="pgadmin" # note: password in lowercase # http://stackoverflow.com/questions/32762426/what-are-the-limitations-of-postgres-master-password-in-rds master_user_password=$(< /dev/urandom tr -dc a-z0-9 | head -c32) #################### # create instance #################### echo "creating instance from snapshot $rds_snapshot ..." db_instance_id=$(\ aws rds restore-db-instance-from-db-snapshot \ --db-instance-identifier $rds_instance_id --db-snapshot-identifier $rds_snapshot \ --db-instance-class $db_instance_class --no-multi-az \ --db-subnet-group-name $db_subnet_group_name \ --query 'DBInstance.DBInstanceIdentifier' \ --output text) echo "db instance id: $db_instance_id" # e.g. ig-dev-d30b4 echo "waiting for the instance to be available (at least a few minutes) ..." aws rds wait db-instance-available --db-instance-identifier $db_instance_id db_instance_arn="arn:aws:rds:$db_instance_region:$aws_account_number:db:$db_instance_id" # e.g. arn:aws:rds:us-west-2:837173812892:db:ig-dev-7c8d8 db_instance_address=$( aws rds describe-db-instances --db-instance-identifier $db_instance_id \ --query 'DBInstances[*].Endpoint.Address' \ --output text) echo "instance arn: $db_instance_arn" echo "instance endpoint address: $db_instance_address" #################### # modify instance #################### echo "" echo "requesting instance modifications ..." # note: we may not request modifications when the instance is not available # "A client error (InvalidDBInstanceState) occurred when calling the # ModifyDBInstance operation: Database instance is not in available state." echo "db instance values pending to be modified:" aws rds modify-db-instance --db-instance-identifier $db_instance_id \ --master-user-password $master_user_password \ --backup-retention-period 0 --no-auto-minor-version-upgrade --apply-immediately \ --query 'DBInstance.PendingModifiedValues' echo "waiting for the modifications to be applied ..." aws rds wait db-instance-available --db-instance-identifier $db_instance_id aws rds add-tags-to-resource --resource-name $db_instance_arn --tags Key=env,Value=dev echo "" echo "instance master username: $master_username" echo "instance master user password: $master_user_password" echo "" echo "command for connecting to Postgres:" echo "(you may omit the password and enter it when prompted)" echo " psql postgresql://$master_username:$master_user_password@$db_instance_address:5432/pstn_db"