示例#1
0
        public override void Invoke(AWSCredentials creds, RegionEndpoint region, int maxItems)
        {
            AmazonCostAndUsageReportConfig config = new AmazonCostAndUsageReportConfig();

            config.RegionEndpoint = region;
            ConfigureClient(config);
            AmazonCostAndUsageReportClient client = new AmazonCostAndUsageReportClient(creds, config);

            DescribeReportDefinitionsResponse resp = new DescribeReportDefinitionsResponse();

            do
            {
                DescribeReportDefinitionsRequest req = new DescribeReportDefinitionsRequest
                {
                    NextToken = resp.NextToken
                    ,
                    MaxResults = maxItems
                };

                resp = client.DescribeReportDefinitions(req);
                CheckError(resp.HttpStatusCode, "200");

                foreach (var obj in resp.ReportDefinitions)
                {
                    AddObject(obj);
                }
            }while (!string.IsNullOrEmpty(resp.NextToken));
        }
示例#2
0
        public void CostAndUsageReportPutReportDefinition()
        {
            #region to-create-a-report-definitions

            var client   = new AmazonCostAndUsageReportClient();
            var response = client.PutReportDefinition(new PutReportDefinitionRequest
            {
                ReportDefinition = new ReportDefinition {
                    AdditionalArtifacts = new List <string> {
                        "REDSHIFT",
                        "QUICKSIGHT"
                    },
                    AdditionalSchemaElements = new List <string> {
                        "RESOURCES"
                    },
                    Compression = "ZIP",
                    Format      = "textORcsv",
                    ReportName  = "ExampleReport",
                    S3Bucket    = "example-s3-bucket",
                    S3Prefix    = "exampleprefix",
                    S3Region    = "us-east-1",
                    TimeUnit    = "DAILY"
                }
            });


            #endregion
        }
示例#3
0
        public void CostAndUsageReportDeleteReportDefinition()
        {
            #region to-delete-a-report

            var client   = new AmazonCostAndUsageReportClient();
            var response = client.DeleteReportDefinition(new DeleteReportDefinitionRequest
            {
                ReportName = "ExampleReport"
            });


            #endregion
        }
        protected IAmazonCostAndUsageReport CreateClient(AWSCredentials credentials, RegionEndpoint region)
        {
            var config = new AmazonCostAndUsageReportConfig {
                RegionEndpoint = region
            };

            Amazon.PowerShell.Utils.Common.PopulateConfig(this, config);
            this.CustomizeClientConfig(config);
            var client = new AmazonCostAndUsageReportClient(credentials, config);

            client.BeforeRequestEvent += RequestEventHandler;
            client.AfterResponseEvent += ResponseEventHandler;
            return(client);
        }
示例#5
0
        public void CostAndUsageReportDescribeReportDefinitions()
        {
            #region to-retrieve-report-definitions

            var client   = new AmazonCostAndUsageReportClient();
            var response = client.DescribeReportDefinitions(new DescribeReportDefinitionsRequest
            {
                MaxResults = 5
            });

            List <ReportDefinition> reportDefinitions = response.ReportDefinitions;

            #endregion
        }
示例#6
0
        /// <summary>
        /// Default constructor that Lambda will invoke.
        /// </summary>
        public Entrypoint()
        {
            Func <CustomResourceRequest, ILambdaContext, Task <CustomResourceResponse> > CreateAsync = async(request, context) =>
            {
                string ReportName = String.Empty;

                try
                {
                    //arn:aws:lambda:us-east-1:123456789012:function:FunctionName
                    string[] Parts     = context.InvokedFunctionArn.Split(":");
                    string   Region    = Parts[3];
                    string   AccountId = Parts[4];

                    AmazonCostAndUsageReportConfig Config = new AmazonCostAndUsageReportConfig();
                    IAmazonCostAndUsageReport      Client = new AmazonCostAndUsageReportClient(Config);

                    PutReportDefinitionRequest Request = JsonConvert.DeserializeObject <PutReportDefinitionRequest>(JsonConvert.SerializeObject(request.ResourceProperties));

                    if (String.IsNullOrEmpty(Request.ReportDefinition.ReportName))
                    {
                        Request.ReportDefinition.ReportName = request.LogicalResourceId;
                    }

                    ReportName = Request.ReportDefinition.ReportName;

                    if (Request.ReportDefinition.AdditionalSchemaElements == null)
                    {
                        Request.ReportDefinition.AdditionalSchemaElements = new List <string>();
                    }

                    // This is required to prevent this error: Value null at 'reportDefinition.additionalSchemaElements' failed to satisfy constraint: Member must not be null
                    if (!Request.ReportDefinition.AdditionalSchemaElements.Contains("RESOURCES"))
                    {
                        Request.ReportDefinition.AdditionalSchemaElements.Add("RESOURCES");
                    }

                    // Setup defaults for the definition
                    if (String.IsNullOrEmpty(Request.ReportDefinition.S3Region))
                    {
                        Request.ReportDefinition.S3Region = Region;
                    }

                    if (Request.ReportDefinition.TimeUnit == null || String.IsNullOrEmpty(Request.ReportDefinition.TimeUnit.Value))
                    {
                        Request.ReportDefinition.TimeUnit = DefaultTimeUnit;
                    }

                    if (Request.ReportDefinition.AdditionalArtifacts != null &&
                        Request.ReportDefinition.AdditionalArtifacts.Any(x => x.Equals("ATHENA", StringComparison.OrdinalIgnoreCase))
                        )
                    {
                        if (Request.ReportDefinition.AdditionalArtifacts.Count > 1)
                        {
                            throw new InvalidOperationException("The additional artifact ATHENA cannot be combined with other values.");
                        }

                        if (Request.ReportDefinition.Format != ReportFormat.Parquet || Request.ReportDefinition.Compression != CompressionFormat.Parquet)
                        {
                            throw new InvalidOperationException("You must specify Parquet as the format and compression type when ATHENA is specified as the additional artifact.");
                        }
                    }
                    else if (Request.ReportDefinition.AdditionalArtifacts.Any(x => x.Equals("REDSHIFT", StringComparison.OrdinalIgnoreCase) || x.Equals("QUICKSIGHT", StringComparison.OrdinalIgnoreCase)))
                    {
                        if (Request.ReportDefinition.Format != ReportFormat.TextORcsv || Request.ReportDefinition.Compression != CompressionFormat.GZIP)
                        {
                            throw new InvalidOperationException("You must specify TextORCsv as the format and GZIP as the compression type when REDSHIFT or QUICKSIGHT are specified as the additional artifacts.");
                        }
                    }
                    else
                    {
                        if (Request.ReportDefinition.Compression == null || String.IsNullOrEmpty(Request.ReportDefinition.Compression.Value))
                        {
                            Request.ReportDefinition.Compression = DefaultCompression;
                        }

                        if (Request.ReportDefinition.Format == null || String.IsNullOrEmpty(Request.ReportDefinition.Format.Value))
                        {
                            Request.ReportDefinition.Format = DefaultFormat;
                        }
                    }

                    PutReportDefinitionResponse Response = await Client.PutReportDefinitionAsync(Request);

                    if ((int)Response.HttpStatusCode < 200 || (int)Response.HttpStatusCode > 299)
                    {
                        return(new CustomResourceResponse(
                                   CustomResourceResponse.RequestStatus.FAILED,
                                   $"Received HTTP status code {(int)Response.HttpStatusCode}.",
                                   request
                                   ));
                    }
                    else
                    {
                        return(new CustomResourceResponse(
                                   CustomResourceResponse.RequestStatus.SUCCESS,
                                   $"See the details in CloudWatch Log Stream: {context.LogStreamName}.",
                                   Request.ReportDefinition.ReportName,
                                   request.StackId,
                                   request.RequestId,
                                   request.LogicalResourceId,
                                   false,
                                   new Dictionary <string, object>()
                        {
                            { "Name", Request.ReportDefinition.ReportName },
                            { "Arn", $"arn:aws:cur:{Region}:{AccountId}:definition/{ReportName}" },
                            { "Id", Request.ReportDefinition.ReportName }
                        }
                                   ));
                    }
                }
                catch (AmazonCostAndUsageReportException e)
                {
                    context.LogError(e);

                    return(new CustomResourceResponse(
                               CustomResourceResponse.RequestStatus.FAILED,
                               e.Message,
                               ReportName,
                               request.StackId,
                               request.RequestId,
                               request.LogicalResourceId
                               ));
                }
                catch (Exception e)
                {
                    context.LogError(e);

                    return(new CustomResourceResponse(
                               CustomResourceResponse.RequestStatus.FAILED,
                               e.Message,
                               ReportName,
                               request.StackId,
                               request.RequestId,
                               request.LogicalResourceId
                               ));
                }
            };

            Func <CustomResourceRequest, ILambdaContext, Task <CustomResourceResponse> > DeleteAsync = async(request, context) =>
            {
                try
                {
                    //arn:aws:lambda:us-east-1:123456789012:function:FunctionName
                    string[] Parts     = context.InvokedFunctionArn.Split(":");
                    string   Region    = Parts[3];
                    string   AccountId = Parts[4];

                    AmazonCostAndUsageReportConfig Config = new AmazonCostAndUsageReportConfig();
                    IAmazonCostAndUsageReport      Client = new AmazonCostAndUsageReportClient(Config);

                    DeleteReportDefinitionRequest Request = new DeleteReportDefinitionRequest()
                    {
                        ReportName = request.PhysicalResourceId
                    };

                    DeleteReportDefinitionResponse Response = await Client.DeleteReportDefinitionAsync(Request);

                    if ((int)Response.HttpStatusCode < 200 || (int)Response.HttpStatusCode > 299)
                    {
                        return(new CustomResourceResponse(CustomResourceResponse.RequestStatus.FAILED, $"Received HTTP status code {(int)Response.HttpStatusCode}.", request));
                    }
                    else
                    {
                        return(new CustomResourceResponse(
                                   CustomResourceResponse.RequestStatus.SUCCESS,
                                   $"See the details in CloudWatch Log Stream: {context.LogStreamName}.",
                                   request.PhysicalResourceId,
                                   request.StackId,
                                   request.RequestId,
                                   request.LogicalResourceId,
                                   false,
                                   new Dictionary <string, object>()
                        {
                            { "Name", request.PhysicalResourceId as string },
                            { "Arn", $"arn:aws:cur:{Region}:{AccountId}:definition/{request.PhysicalResourceId}" },
                            { "Id", request.PhysicalResourceId as string }
                        }
                                   ));
                    }
                }
                catch (AmazonCostAndUsageReportException e)
                {
                    context.LogError(e);

                    return(new CustomResourceResponse(
                               CustomResourceResponse.RequestStatus.FAILED,
                               e.Message,
                               request.PhysicalResourceId,
                               request.StackId,
                               request.RequestId,
                               request.LogicalResourceId
                               ));
                }
                catch (Exception e)
                {
                    context.LogError(e);

                    return(new CustomResourceResponse(
                               CustomResourceResponse.RequestStatus.FAILED,
                               e.Message,
                               request.PhysicalResourceId,
                               request.StackId,
                               request.RequestId,
                               request.LogicalResourceId
                               ));
                }
            };

            Func <CustomResourceRequest, ILambdaContext, Task <CustomResourceResponse> > UpdateAsync = async(request, context) =>
            {
                CustomResourceResponse Response = await DeleteAsync(request, context);

                if (Response.Status == CustomResourceResponse.RequestStatus.SUCCESS)
                {
                    return(await CreateAsync(request, context));
                }
                else
                {
                    return(Response);
                }
            };

            this._Handler = new CustomResourceFactory(CreateAsync, UpdateAsync, DeleteAsync);

            this.ProcessEnvironmentVariables();
        }