static void Main(string[] args) { Console.WriteLine("Started Dump..."); string databaseNameOrigin = System.Environment.GetEnvironmentVariable("DatabaseNameOrigin", EnvironmentVariableTarget.Machine); string databaseNameTarget = System.Environment.GetEnvironmentVariable("DatabaseNameTarget", EnvironmentVariableTarget.Machine); string database = System.Environment.GetEnvironmentVariable("Database", EnvironmentVariableTarget.Machine); string databaseUser = System.Environment.GetEnvironmentVariable("DatabaseUser", EnvironmentVariableTarget.Machine); string databasePassword = System.Environment.GetEnvironmentVariable("DatabasePassword", EnvironmentVariableTarget.Machine); string s3BucketName = System.Environment.GetEnvironmentVariable("S3BucketName", EnvironmentVariableTarget.Machine); try { using (AmazonRDSClient rdsClient = new AmazonRDSClient(RegionEndpoint.USWest2)) { DBSnapshot newerSnapshot = getNewerSnapshot(databaseNameOrigin, rdsClient); Console.WriteLine("Snapshot found: " + newerSnapshot.DBSnapshotIdentifier); restoreSnapshotIntoDBTarget(databaseNameTarget, rdsClient, newerSnapshot); Console.WriteLine("Restoring Snapshot Into RDS account... "); Thread.Sleep(60000); string address = waitUntilDBTargetIsAvailable(databaseNameTarget, rdsClient); Console.WriteLine("Snapshot Restored. Exporting BACPAC to file... "); exportBacpac(database, databaseUser, databasePassword, address); Console.WriteLine("BACPAC exported. Deleting RDS backup database... "); deleteDatabaseByName(databaseNameTarget, rdsClient); } using (var s3Client = new AmazonS3Client(RegionEndpoint.SAEast1)) { Console.WriteLine("Uploading BACPAC to S3... "); uploadFileToS3(s3BucketName, "dump.bacpac", s3Client); Console.WriteLine("BACPAC Upload and temporaries deleted!"); } Console.WriteLine("Dump completed successfully!"); } catch (DacServicesException e) { Console.WriteLine("Error Encountered:{0} Inner Exception: {1}", e.Messages, e.InnerException); } catch (Exception e) { Console.WriteLine("Error Encountered:{0} Inner Exception: {1}", e.Message, e.InnerException); } }
public static AmazonRDSClient GetRdsConnection() { if (rds == null) { rds = new AmazonRDSClient(AwsKeyProviders.Key, AwsKeyProviders.Secret, RegionEndpoint.EUWest1); } return rds; }
private static void deleteDatabaseByName(string databaseNameTarget, AmazonRDSClient rdsClient) { DeleteDBInstanceRequest deleteRequest = new DeleteDBInstanceRequest() { DBInstanceIdentifier = databaseNameTarget, SkipFinalSnapshot = true }; DeleteDBInstanceResponse deleteResponse = rdsClient.DeleteDBInstance(deleteRequest); HttpStatusCode statusCode = deleteResponse.HttpStatusCode; if (!statusCode.Equals(HttpStatusCode.OK)) { throw new Exception(); } }
private static DBSnapshot getNewerSnapshot(string databaseNameOrigin, AmazonRDSClient rdsClient) { DescribeDBSnapshotsRequest describeSnapshotsRequest = new DescribeDBSnapshotsRequest() { DBInstanceIdentifier = databaseNameOrigin, SnapshotType = "automated" }; DescribeDBSnapshotsResponse describeSnapshotsResponse = rdsClient.DescribeDBSnapshots(describeSnapshotsRequest); List<DBSnapshot> snapshots = describeSnapshotsResponse.DBSnapshots; IEnumerable<DBSnapshot> orderedSnapshots = snapshots.OrderByDescending(x => x.SnapshotCreateTime); DBSnapshot newerSnapshot = orderedSnapshots.First(); return newerSnapshot; }
private OperationResult EstablishClient(AddonManifest manifest, DeveloperOptions devOptions, out AmazonRDSClient client) { OperationResult result; bool requireCreds; var manifestProps = manifest.GetProperties().ToDictionary(x => x.Key, x => x.Value); var accessKey = manifestProps["AWSClientKey"]; var secretAccessKey = manifestProps["AWSSecretKey"]; var regionEndpoint = manifestProps["AWSRegionEndpoint"]; var prop = manifest.Properties.First( p => p.Key.Equals("requireDevCredentials", StringComparison.InvariantCultureIgnoreCase)); if (bool.TryParse(prop.Value, out requireCreds) && requireCreds) { if (!ValidateDevCreds(devOptions)) { client = null; result = new OperationResult() { IsSuccess = false, EndUserMessage = "The add on requires that developer credentials are specified but none were provided." }; return result; } accessKey = devOptions.AccessKey; secretAccessKey = devOptions.SecretAccessKey; } AmazonRDSConfig config = new AmazonRDSConfig() { RegionEndpoint = RegionEndpoint.USEast1 }; client = new AmazonRDSClient(accessKey, secretAccessKey, config); result = new OperationResult { IsSuccess = true }; return result; }
protected virtual AmazonRDS GetClient() { AmazonCredentials.KeyPair credentials = base.GetCredentials(); AmazonRDS client = new AmazonRDSClient(credentials.AwsAccessKeyId, credentials.AwsSecretAccessKey); return client; }
private static string waitUntilDBTargetIsAvailable(string databaseNameTarget, AmazonRDSClient rdsClient) { string status = ""; string address = ""; do { DescribeDBInstancesRequest describeInstancesRequest = new DescribeDBInstancesRequest() { DBInstanceIdentifier = databaseNameTarget }; DescribeDBInstancesResponse describeInstancesResponse = rdsClient.DescribeDBInstances(describeInstancesRequest); DBInstance dbInstance = describeInstancesResponse.DBInstances.First(); status = dbInstance.DBInstanceStatus; if (dbInstance.Endpoint != null) { address = dbInstance.Endpoint.Address; } Thread.Sleep(60000); } while (status != "available"); return address; }
private static void restoreSnapshotIntoDBTarget(string databaseNameTarget, AmazonRDSClient rdsClient, DBSnapshot newerSnapshot) { RestoreDBInstanceFromDBSnapshotRequest restoreRequest = new RestoreDBInstanceFromDBSnapshotRequest() { DBSnapshotIdentifier = newerSnapshot.DBSnapshotIdentifier, DBInstanceIdentifier = databaseNameTarget }; rdsClient.RestoreDBInstanceFromDBSnapshot(restoreRequest); }