private async Task <Dictionary <String, String> > CreateResourcesForScheduledQuery(
            Dictionary <String, String> resourcesDict)
        {
            //Create database and table to store scheduled query results
            await _timestreamCrudHelper.CreateDatabase(_amazonTimestreamWrite, ScheduledQueryConstants.SqDatabaseName);

            await _timestreamCrudHelper.CreateTable(_amazonTimestreamWrite, ScheduledQueryConstants.SqDatabaseName,
                                                    ScheduledQueryConstants.SqTableName, resourcesDict[AwsResourceConstant.BucketName]);

            //Create sns and sqs for scheduled query
            string topicArn =
                await _timestreamDependencyHelper.CreateSnsTopic(snsClient, ScheduledQueryConstants.TopicName);

            resourcesDict.Add(ScheduledQueryConstants.TopicArn, topicArn);

            string sqsQueueUrl =
                await _timestreamDependencyHelper.CreateQueue(sqsClient, ScheduledQueryConstants.FifoQueueName);

            resourcesDict.Add(ScheduledQueryConstants.QueueUrl, sqsQueueUrl);

            string sqsQueueArn =
                await _timestreamDependencyHelper.GetQueueArn(sqsClient, sqsQueueUrl);

            string subscriptionArn =
                await _timestreamDependencyHelper.SubscribeToSnsTopic(snsClient, topicArn, sqsQueueArn);

            resourcesDict.Add(ScheduledQueryConstants.SubscriptionArn, subscriptionArn);

            await _timestreamDependencyHelper.SetSqsAccessPolicy(sqsClient, sqsQueueUrl, topicArn, sqsQueueArn);

            string roleArn = await _timestreamDependencyHelper.CreateIamRole(iamClient,
                                                                             ScheduledQueryConstants.IamRoleName, regionEndpoint.SystemName);

            resourcesDict.Add(ScheduledQueryConstants.RoleName, ScheduledQueryConstants.IamRoleName);
            resourcesDict.Add(ScheduledQueryConstants.RoleArn, roleArn);

            string policyArn =
                await _timestreamDependencyHelper.CreateIamPolicy(iamClient, ScheduledQueryConstants.PolicyName);

            resourcesDict.Add(ScheduledQueryConstants.PolicyArn, policyArn);

            await _timestreamDependencyHelper.AttachIamRolePolicy(iamClient, ScheduledQueryConstants.IamRoleName,
                                                                  policyArn);

            // Wait at-least 15s for policy to be ready
            Console.WriteLine("Waiting 15 seconds for policy to be ready");
            Thread.Sleep(15000);

            return(resourcesDict);
        }
 public async Task CreateTable(string s3ErrorReportBucketName)
 {
     await _crudHelper.CreateTable(writeClient, Constants.DATABASE_NAME, Constants.TABLE_NAME, s3ErrorReportBucketName);
 }
        static async Task MainAsync(string kmsKeyId, string csvFilePath, string region, bool skipDeletion)
        {
            // Recommended Timestream write client SDK configuration:
            // - Set SDK retry count to 10
            // - Set RequestTimeout to 100 seconds
            var writeClientConfig = new AmazonTimestreamWriteConfig
            {
                RegionEndpoint = RegionEndpoint.GetBySystemName(region),
                Timeout        = TimeSpan.FromSeconds(100),
                MaxErrorRetry  = 10
            };

            var writeClient = new AmazonTimestreamWriteClient(writeClientConfig);
            var crudHelper  = new TimestreamCrudHelper();
            var timestreamDependencyHelper    = new TimestreamDependencyHelper();
            var crudAndSimpleIngestionExample = new CrudAndSimpleIngestionExample(writeClient, crudHelper);
            var csvIngestionExample           = new CsvIngestionExample(writeClient);
            var multiValueIngestionExample    = new MultiValueAttributesExample(writeClient);
            var s3Client = new AmazonS3Client(RegionEndpoint.GetBySystemName(region));

            var queryClientConfig = new AmazonTimestreamQueryConfig
            {
                RegionEndpoint = RegionEndpoint.GetBySystemName(region)
            };
            var queryClient  = new AmazonTimestreamQueryClient(queryClientConfig);
            var queryExample = new QueryExample(queryClient);

            await crudAndSimpleIngestionExample.CreateDatabase();

            await crudAndSimpleIngestionExample.DescribeDatabase();

            await crudAndSimpleIngestionExample.ListDatabases();

            if (kmsKeyId != null)
            {
                await crudAndSimpleIngestionExample.UpdateDatabase("TestFakeKey");
            }

            Dictionary <string, string> resourcesCreated = new Dictionary <string, string>();
            var s3ErrorReportBucketName = AwsResourceConstant.ErrorConfigurationS3BucketNamePrefix +
                                          Guid.NewGuid().ToString("n").Substring(0, 8);
            await timestreamDependencyHelper.CreateS3Bucket(s3Client, s3ErrorReportBucketName);

            resourcesCreated.Add(AwsResourceConstant.BucketName, s3ErrorReportBucketName);

            await crudAndSimpleIngestionExample.CreateTable(s3ErrorReportBucketName);

            await crudAndSimpleIngestionExample.DescribeTable();

            await crudAndSimpleIngestionExample.ListTables();

            await crudAndSimpleIngestionExample.UpdateTable();

            // Simple records ingestion
            await crudAndSimpleIngestionExample.WriteRecordsMultiMeasure();

            await crudAndSimpleIngestionExample.WriteRecordsWithCommonAttributes();

            // upsert records
            await crudAndSimpleIngestionExample.WriteRecordsWithUpsert();

            // write multi value records
            await crudHelper.CreateDatabase(writeClient, MultiMeasureValueConstants.MultiMeasureValueSampleDb);

            await crudHelper.CreateTable(writeClient, MultiMeasureValueConstants.MultiMeasureValueSampleDb,
                                         MultiMeasureValueConstants.MultiMeasureValueSampleTable, s3ErrorReportBucketName);

            await multiValueIngestionExample.WriteRecordsMultiMeasureValueSingleRecord();

            await multiValueIngestionExample.WriteRecordsMultiMeasureValueMultipleRecords();

            if (csvFilePath != null)
            {
                // Bulk record ingestion for bootstrapping a table with fresh data
                await csvIngestionExample.BulkWriteRecordsMultiMeasure(csvFilePath);

                await queryExample.RunAllQueries();

                // Try cancelling query
                await queryExample.CancelQuery();

                // Run query with multiple pages
                await queryExample.RunQueryWithMultiplePages(20000);

                // Run Scheduled Query examples only if CSV was provided
                var scheduledQueryExample = new ScheduledQueryExample(writeClient, queryClient,
                                                                      timestreamDependencyHelper,
                                                                      crudHelper, queryExample, region, s3Client);
                await scheduledQueryExample.RunScheduledQueryExample(skipDeletion, resourcesCreated);
            }
            else
            {
                Console.WriteLine("Running the SELECT ALL query");
                await queryExample.RunQueryAsync(QueryExample.SELECT_ALL_QUERY + " LIMIT 10");
            }

            if (!skipDeletion)
            {
                await crudAndSimpleIngestionExample.DeleteTable();

                await crudAndSimpleIngestionExample.DeleteDatabase();
            }
        }