MetricStream class

Provides a CloudWatch Metric Stream resource.

Example Usage

Filters

import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";

// https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-metric-streams-trustpolicy.html
const streamsAssumeRole = aws.iam.getPolicyDocument({
    statements: [{
        principals: [{
            type: "Service",
            identifiers: ["streams.metrics.cloudwatch.amazonaws.com"],
        }],
        effect: "Allow",
        actions: ["sts:AssumeRole"],
    }],
});
const metricStreamToFirehoseRole = new aws.iam.Role("metric_stream_to_firehose", {
    name: "metric_stream_to_firehose_role",
    assumeRolePolicy: streamsAssumeRole.then(streamsAssumeRole => streamsAssumeRole.json),
});
const bucket = new aws.s3.Bucket("bucket", {bucket: "metric-stream-test-bucket"});
const firehoseAssumeRole = aws.iam.getPolicyDocument({
    statements: [{
        principals: [{
            type: "Service",
            identifiers: ["firehose.amazonaws.com"],
        }],
        effect: "Allow",
        actions: ["sts:AssumeRole"],
    }],
});
const firehoseToS3Role = new aws.iam.Role("firehose_to_s3", {assumeRolePolicy: firehoseAssumeRole.then(firehoseAssumeRole => firehoseAssumeRole.json)});
const s3Stream = new aws.kinesis.FirehoseDeliveryStream("s3_stream", {
    extendedS3Configuration: {
        roleArn: firehoseToS3Role.arn,
        bucketArn: bucket.arn,
    },
    name: "metric-stream-test-stream",
    destination: "extended_s3",
});
const main = new aws.cloudwatch.MetricStream("main", {
    includeFilters: [
        {
            namespace: "AWS/EC2",
            metricNames: [
                "CPUUtilization",
                "NetworkOut",
            ],
        },
        {
            namespace: "AWS/EBS",
            metricNames: [],
        },
    ],
    name: "my-metric-stream",
    roleArn: metricStreamToFirehoseRole.arn,
    firehoseArn: s3Stream.arn,
    outputFormat: "json",
});
// https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-metric-streams-trustpolicy.html
const metricStreamToFirehose = aws.iam.getPolicyDocumentOutput({
    statements: [{
        effect: "Allow",
        actions: [
            "firehose:PutRecord",
            "firehose:PutRecordBatch",
        ],
        resources: [s3Stream.arn],
    }],
});
const metricStreamToFirehoseRolePolicy = new aws.iam.RolePolicy("metric_stream_to_firehose", {
    name: "default",
    role: metricStreamToFirehoseRole.id,
    policy: metricStreamToFirehose.json,
});
const bucketAcl = new aws.s3.BucketAcl("bucket_acl", {
    bucket: bucket.id,
    acl: "private",
});
const firehoseToS3 = aws.iam.getPolicyDocumentOutput({
    statements: [{
        effect: "Allow",
        actions: [
            "s3:AbortMultipartUpload",
            "s3:GetBucketLocation",
            "s3:GetObject",
            "s3:ListBucket",
            "s3:ListBucketMultipartUploads",
            "s3:PutObject",
        ],
        resources: [
            bucket.arn,
            pulumi.interpolate`${bucket.arn}/*`,
        ],
    }],
});
const firehoseToS3RolePolicy = new aws.iam.RolePolicy("firehose_to_s3", {
    name: "default",
    role: firehoseToS3Role.id,
    policy: firehoseToS3.json,
});
import pulumi
import pulumi_aws as aws

# https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-metric-streams-trustpolicy.html
streams_assume_role = aws.iam.get_policy_document(statements=[{
    "principals": [{
        "type": "Service",
        "identifiers": ["streams.metrics.cloudwatch.amazonaws.com"],
    }],
    "effect": "Allow",
    "actions": ["sts:AssumeRole"],
}])
metric_stream_to_firehose_role = aws.iam.Role("metric_stream_to_firehose",
    name="metric_stream_to_firehose_role",
    assume_role_policy=streams_assume_role.json)
bucket = aws.s3.Bucket("bucket", bucket="metric-stream-test-bucket")
firehose_assume_role = aws.iam.get_policy_document(statements=[{
    "principals": [{
        "type": "Service",
        "identifiers": ["firehose.amazonaws.com"],
    }],
    "effect": "Allow",
    "actions": ["sts:AssumeRole"],
}])
firehose_to_s3_role = aws.iam.Role("firehose_to_s3", assume_role_policy=firehose_assume_role.json)
s3_stream = aws.kinesis.FirehoseDeliveryStream("s3_stream",
    extended_s3_configuration={
        "role_arn": firehose_to_s3_role.arn,
        "bucket_arn": bucket.arn,
    },
    name="metric-stream-test-stream",
    destination="extended_s3")
main = aws.cloudwatch.MetricStream("main",
    include_filters=[
        {
            "namespace": "AWS/EC2",
            "metric_names": [
                "CPUUtilization",
                "NetworkOut",
            ],
        },
        {
            "namespace": "AWS/EBS",
            "metric_names": [],
        },
    ],
    name="my-metric-stream",
    role_arn=metric_stream_to_firehose_role.arn,
    firehose_arn=s3_stream.arn,
    output_format="json")
# https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-metric-streams-trustpolicy.html
metric_stream_to_firehose = aws.iam.get_policy_document_output(statements=[{
    "effect": "Allow",
    "actions": [
        "firehose:PutRecord",
        "firehose:PutRecordBatch",
    ],
    "resources": [s3_stream.arn],
}])
metric_stream_to_firehose_role_policy = aws.iam.RolePolicy("metric_stream_to_firehose",
    name="default",
    role=metric_stream_to_firehose_role.id,
    policy=metric_stream_to_firehose.json)
bucket_acl = aws.s3.BucketAcl("bucket_acl",
    bucket=bucket.id,
    acl="private")
firehose_to_s3 = aws.iam.get_policy_document_output(statements=[{
    "effect": "Allow",
    "actions": [
        "s3:AbortMultipartUpload",
        "s3:GetBucketLocation",
        "s3:GetObject",
        "s3:ListBucket",
        "s3:ListBucketMultipartUploads",
        "s3:PutObject",
    ],
    "resources": [
        bucket.arn,
        bucket.arn.apply(lambda arn: f"{arn}/*"),
    ],
}])
firehose_to_s3_role_policy = aws.iam.RolePolicy("firehose_to_s3",
    name="default",
    role=firehose_to_s3_role.id,
    policy=firehose_to_s3.json)
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Aws = Pulumi.Aws;

return await Deployment.RunAsync(() =>
{
    // https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-metric-streams-trustpolicy.html
    var streamsAssumeRole = Aws.Iam.GetPolicyDocument.Invoke(new()
    {
        Statements = new[]
        {
            new Aws.Iam.Inputs.GetPolicyDocumentStatementInputArgs
            {
                Principals = new[]
                {
                    new Aws.Iam.Inputs.GetPolicyDocumentStatementPrincipalInputArgs
                    {
                        Type = "Service",
                        Identifiers = new[]
                        {
                            "streams.metrics.cloudwatch.amazonaws.com",
                        },
                    },
                },
                Effect = "Allow",
                Actions = new[]
                {
                    "sts:AssumeRole",
                },
            },
        },
    });

    var metricStreamToFirehoseRole = new Aws.Iam.Role("metric_stream_to_firehose", new()
    {
        Name = "metric_stream_to_firehose_role",
        AssumeRolePolicy = streamsAssumeRole.Apply(getPolicyDocumentResult => getPolicyDocumentResult.Json),
    });

    var bucket = new Aws.S3.Bucket("bucket", new()
    {
        BucketName = "metric-stream-test-bucket",
    });

    var firehoseAssumeRole = Aws.Iam.GetPolicyDocument.Invoke(new()
    {
        Statements = new[]
        {
            new Aws.Iam.Inputs.GetPolicyDocumentStatementInputArgs
            {
                Principals = new[]
                {
                    new Aws.Iam.Inputs.GetPolicyDocumentStatementPrincipalInputArgs
                    {
                        Type = "Service",
                        Identifiers = new[]
                        {
                            "firehose.amazonaws.com",
                        },
                    },
                },
                Effect = "Allow",
                Actions = new[]
                {
                    "sts:AssumeRole",
                },
            },
        },
    });

    var firehoseToS3Role = new Aws.Iam.Role("firehose_to_s3", new()
    {
        AssumeRolePolicy = firehoseAssumeRole.Apply(getPolicyDocumentResult => getPolicyDocumentResult.Json),
    });

    var s3Stream = new Aws.Kinesis.FirehoseDeliveryStream("s3_stream", new()
    {
        ExtendedS3Configuration = new Aws.Kinesis.Inputs.FirehoseDeliveryStreamExtendedS3ConfigurationArgs
        {
            RoleArn = firehoseToS3Role.Arn,
            BucketArn = bucket.Arn,
        },
        Name = "metric-stream-test-stream",
        Destination = "extended_s3",
    });

    var main = new Aws.CloudWatch.MetricStream("main", new()
    {
        IncludeFilters = new[]
        {
            new Aws.CloudWatch.Inputs.MetricStreamIncludeFilterArgs
            {
                Namespace = "AWS/EC2",
                MetricNames = new[]
                {
                    "CPUUtilization",
                    "NetworkOut",
                },
            },
            new Aws.CloudWatch.Inputs.MetricStreamIncludeFilterArgs
            {
                Namespace = "AWS/EBS",
                MetricNames = new() { },
            },
        },
        Name = "my-metric-stream",
        RoleArn = metricStreamToFirehoseRole.Arn,
        FirehoseArn = s3Stream.Arn,
        OutputFormat = "json",
    });

    // https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-metric-streams-trustpolicy.html
    var metricStreamToFirehose = Aws.Iam.GetPolicyDocument.Invoke(new()
    {
        Statements = new[]
        {
            new Aws.Iam.Inputs.GetPolicyDocumentStatementInputArgs
            {
                Effect = "Allow",
                Actions = new[]
                {
                    "firehose:PutRecord",
                    "firehose:PutRecordBatch",
                },
                Resources = new[]
                {
                    s3Stream.Arn,
                },
            },
        },
    });

    var metricStreamToFirehoseRolePolicy = new Aws.Iam.RolePolicy("metric_stream_to_firehose", new()
    {
        Name = "default",
        Role = metricStreamToFirehoseRole.Id,
        Policy = metricStreamToFirehose.Apply(getPolicyDocumentResult => getPolicyDocumentResult.Json),
    });

    var bucketAcl = new Aws.S3.BucketAcl("bucket_acl", new()
    {
        Bucket = bucket.Id,
        Acl = "private",
    });

    var firehoseToS3 = Aws.Iam.GetPolicyDocument.Invoke(new()
    {
        Statements = new[]
        {
            new Aws.Iam.Inputs.GetPolicyDocumentStatementInputArgs
            {
                Effect = "Allow",
                Actions = new[]
                {
                    "s3:AbortMultipartUpload",
                    "s3:GetBucketLocation",
                    "s3:GetObject",
                    "s3:ListBucket",
                    "s3:ListBucketMultipartUploads",
                    "s3:PutObject",
                },
                Resources = new[]
                {
                    bucket.Arn,
                    $"{bucket.Arn}/*",
                },
            },
        },
    });

    var firehoseToS3RolePolicy = new Aws.Iam.RolePolicy("firehose_to_s3", new()
    {
        Name = "default",
        Role = firehoseToS3Role.Id,
        Policy = firehoseToS3.Apply(getPolicyDocumentResult => getPolicyDocumentResult.Json),
    });

});
package main

import (
	"fmt"

	"github.com/pulumi/pulumi-aws/sdk/v7/go/aws/cloudwatch"
	"github.com/pulumi/pulumi-aws/sdk/v7/go/aws/iam"
	"github.com/pulumi/pulumi-aws/sdk/v7/go/aws/kinesis"
	"github.com/pulumi/pulumi-aws/sdk/v7/go/aws/s3"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		// https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-metric-streams-trustpolicy.html
		streamsAssumeRole, err := iam.GetPolicyDocument(ctx, &iam.GetPolicyDocumentArgs{
			Statements: []iam.GetPolicyDocumentStatement{
				{
					Principals: []iam.GetPolicyDocumentStatementPrincipal{
						{
							Type: "Service",
							Identifiers: []string{
								"streams.metrics.cloudwatch.amazonaws.com",
							},
						},
					},
					Effect: pulumi.StringRef("Allow"),
					Actions: []string{
						"sts:AssumeRole",
					},
				},
			},
		}, nil)
		if err != nil {
			return err
		}
		metricStreamToFirehoseRole, err := iam.NewRole(ctx, "metric_stream_to_firehose", &iam.RoleArgs{
			Name:             pulumi.String("metric_stream_to_firehose_role"),
			AssumeRolePolicy: pulumi.String(streamsAssumeRole.Json),
		})
		if err != nil {
			return err
		}
		bucket, err := s3.NewBucket(ctx, "bucket", &s3.BucketArgs{
			Bucket: pulumi.String("metric-stream-test-bucket"),
		})
		if err != nil {
			return err
		}
		firehoseAssumeRole, err := iam.GetPolicyDocument(ctx, &iam.GetPolicyDocumentArgs{
			Statements: []iam.GetPolicyDocumentStatement{
				{
					Principals: []iam.GetPolicyDocumentStatementPrincipal{
						{
							Type: "Service",
							Identifiers: []string{
								"firehose.amazonaws.com",
							},
						},
					},
					Effect: pulumi.StringRef("Allow"),
					Actions: []string{
						"sts:AssumeRole",
					},
				},
			},
		}, nil)
		if err != nil {
			return err
		}
		firehoseToS3Role, err := iam.NewRole(ctx, "firehose_to_s3", &iam.RoleArgs{
			AssumeRolePolicy: pulumi.String(firehoseAssumeRole.Json),
		})
		if err != nil {
			return err
		}
		s3Stream, err := kinesis.NewFirehoseDeliveryStream(ctx, "s3_stream", &kinesis.FirehoseDeliveryStreamArgs{
			ExtendedS3Configuration: &kinesis.FirehoseDeliveryStreamExtendedS3ConfigurationArgs{
				RoleArn:   firehoseToS3Role.Arn,
				BucketArn: bucket.Arn,
			},
			Name:        pulumi.String("metric-stream-test-stream"),
			Destination: pulumi.String("extended_s3"),
		})
		if err != nil {
			return err
		}
		_, err = cloudwatch.NewMetricStream(ctx, "main", &cloudwatch.MetricStreamArgs{
			IncludeFilters: cloudwatch.MetricStreamIncludeFilterArray{
				&cloudwatch.MetricStreamIncludeFilterArgs{
					Namespace: pulumi.String("AWS/EC2"),
					MetricNames: pulumi.StringArray{
						pulumi.String("CPUUtilization"),
						pulumi.String("NetworkOut"),
					},
				},
				&cloudwatch.MetricStreamIncludeFilterArgs{
					Namespace:   pulumi.String("AWS/EBS"),
					MetricNames: pulumi.StringArray{},
				},
			},
			Name:         pulumi.String("my-metric-stream"),
			RoleArn:      metricStreamToFirehoseRole.Arn,
			FirehoseArn:  s3Stream.Arn,
			OutputFormat: pulumi.String("json"),
		})
		if err != nil {
			return err
		}
		// https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-metric-streams-trustpolicy.html
		metricStreamToFirehose := iam.GetPolicyDocumentOutput(ctx, iam.GetPolicyDocumentOutputArgs{
			Statements: iam.GetPolicyDocumentStatementArray{
				&iam.GetPolicyDocumentStatementArgs{
					Effect: pulumi.String("Allow"),
					Actions: pulumi.StringArray{
						pulumi.String("firehose:PutRecord"),
						pulumi.String("firehose:PutRecordBatch"),
					},
					Resources: pulumi.StringArray{
						s3Stream.Arn,
					},
				},
			},
		}, nil)
		_, err = iam.NewRolePolicy(ctx, "metric_stream_to_firehose", &iam.RolePolicyArgs{
			Name:   pulumi.String("default"),
			Role:   metricStreamToFirehoseRole.ID().ToIDOutput().ToStringOutput(),
			Policy: metricStreamToFirehose.Json(),
		})
		if err != nil {
			return err
		}
		_, err = s3.NewBucketAcl(ctx, "bucket_acl", &s3.BucketAclArgs{
			Bucket: bucket.ID().ToIDOutput().ToStringOutput(),
			Acl:    pulumi.String("private"),
		})
		if err != nil {
			return err
		}
		firehoseToS3 := iam.GetPolicyDocumentOutput(ctx, iam.GetPolicyDocumentOutputArgs{
			Statements: iam.GetPolicyDocumentStatementArray{
				&iam.GetPolicyDocumentStatementArgs{
					Effect: pulumi.String("Allow"),
					Actions: pulumi.StringArray{
						pulumi.String("s3:AbortMultipartUpload"),
						pulumi.String("s3:GetBucketLocation"),
						pulumi.String("s3:GetObject"),
						pulumi.String("s3:ListBucket"),
						pulumi.String("s3:ListBucketMultipartUploads"),
						pulumi.String("s3:PutObject"),
					},
					Resources: pulumi.StringArray{
						bucket.Arn,
						bucket.Arn.ApplyT(func(arn string) (string, error) {
							return fmt.Sprintf("%v/*", arn), nil
						}).(pulumi.StringOutput),
					},
				},
			},
		}, nil)
		_, err = iam.NewRolePolicy(ctx, "firehose_to_s3", &iam.RolePolicyArgs{
			Name:   pulumi.String("default"),
			Role:   firehoseToS3Role.ID().ToIDOutput().ToStringOutput(),
			Policy: firehoseToS3.Json(),
		})
		if err != nil {
			return err
		}
		return nil
	})
}
pulumi {
  required_providers {
    aws = {
      source = "pulumi/aws"
    }
  }
}

data "aws_iam_getpolicydocument" "streamsAssumeRole" {
  statements {
    principals {
      type        = "Service"
      identifiers = ["streams.metrics.cloudwatch.amazonaws.com"]
    }
    effect  = "Allow"
    actions = ["sts:AssumeRole"]
  }
}
data "aws_iam_getpolicydocument" "metricStreamToFirehose" {
  statements {
    effect    = "Allow"
    actions   = ["firehose:PutRecord", "firehose:PutRecordBatch"]
    resources = [aws_kinesis_firehosedeliverystream.s3_stream.arn]
  }
}
data "aws_iam_getpolicydocument" "firehoseAssumeRole" {
  statements {
    principals {
      type        = "Service"
      identifiers = ["firehose.amazonaws.com"]
    }
    effect  = "Allow"
    actions = ["sts:AssumeRole"]
  }
}
data "aws_iam_getpolicydocument" "firehoseToS3" {
  statements {
    effect    = "Allow"
    actions   = ["s3:AbortMultipartUpload", "s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket", "s3:ListBucketMultipartUploads", "s3:PutObject"]
    resources = [aws_s3_bucket.bucket.arn, "${aws_s3_bucket.bucket.arn}/*"]
  }
}

resource "aws_cloudwatch_metricstream" "main" {
  include_filters {
    namespace    = "AWS/EC2"
    metric_names = ["CPUUtilization", "NetworkOut"]
  }
  include_filters {
    namespace    = "AWS/EBS"
    metric_names = []
  }
  name          = "my-metric-stream"
  role_arn      = aws_iam_role.metric_stream_to_firehose.arn
  firehose_arn  = aws_kinesis_firehosedeliverystream.s3_stream.arn
  output_format = "json"
}
resource "aws_iam_role" "metric_stream_to_firehose" {
  name               = "metric_stream_to_firehose_role"
  assume_role_policy = data.aws_iam_getpolicydocument.streamsAssumeRole.json
}
resource "aws_iam_rolepolicy" "metric_stream_to_firehose" {
  name   = "default"
  role   = aws_iam_role.metric_stream_to_firehose.id
  policy = data.aws_iam_getpolicydocument.metricStreamToFirehose.json
}
resource "aws_s3_bucket" "bucket" {
  bucket = "metric-stream-test-bucket"
}
resource "aws_s3_bucketacl" "bucket_acl" {
  bucket = aws_s3_bucket.bucket.id
  acl    = "private"
}
resource "aws_iam_role" "firehose_to_s3" {
  assume_role_policy = data.aws_iam_getpolicydocument.firehoseAssumeRole.json
}
resource "aws_iam_rolepolicy" "firehose_to_s3" {
  name   = "default"
  role   = aws_iam_role.firehose_to_s3.id
  policy = data.aws_iam_getpolicydocument.firehoseToS3.json
}
resource "aws_kinesis_firehosedeliverystream" "s3_stream" {
  extended_s3_configuration = {
    role_arn   = aws_iam_role.firehose_to_s3.arn
    bucket_arn = aws_s3_bucket.bucket.arn
  }
  name        = "metric-stream-test-stream"
  destination = "extended_s3"
}
# https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-metric-streams-trustpolicy.html
# https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-metric-streams-trustpolicy.html
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.aws.iam.IamFunctions;
import com.pulumi.aws.iam.inputs.GetPolicyDocumentArgs;
import com.pulumi.aws.iam.inputs.GetPolicyDocumentStatementArgs;
import com.pulumi.aws.iam.inputs.GetPolicyDocumentStatementPrincipalArgs;
import com.pulumi.aws.iam.Role;
import com.pulumi.aws.iam.RoleArgs;
import com.pulumi.aws.s3.Bucket;
import com.pulumi.aws.s3.BucketArgs;
import com.pulumi.aws.kinesis.FirehoseDeliveryStream;
import com.pulumi.aws.kinesis.FirehoseDeliveryStreamArgs;
import com.pulumi.aws.kinesis.inputs.FirehoseDeliveryStreamExtendedS3ConfigurationArgs;
import com.pulumi.aws.cloudwatch.MetricStream;
import com.pulumi.aws.cloudwatch.MetricStreamArgs;
import com.pulumi.aws.cloudwatch.inputs.MetricStreamIncludeFilterArgs;
import com.pulumi.aws.iam.RolePolicy;
import com.pulumi.aws.iam.RolePolicyArgs;
import com.pulumi.aws.s3.BucketAcl;
import com.pulumi.aws.s3.BucketAclArgs;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;

public class App {
    public static void main(String[] args) {
        Pulumi.run(App::stack);
    }

    public static void stack(Context ctx) {
        // https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-metric-streams-trustpolicy.html
        final var streamsAssumeRole = IamFunctions.getPolicyDocument(GetPolicyDocumentArgs.builder()
            .statements(GetPolicyDocumentStatementArgs.builder()
                .principals(GetPolicyDocumentStatementPrincipalArgs.builder()
                    .type("Service")
                    .identifiers("streams.metrics.cloudwatch.amazonaws.com")
                    .build())
                .effect("Allow")
                .actions("sts:AssumeRole")
                .build())
            .build());

        var metricStreamToFirehoseRole = new Role("metricStreamToFirehoseRole", RoleArgs.builder()
            .name("metric_stream_to_firehose_role")
            .assumeRolePolicy(streamsAssumeRole.json())
            .build());

        var bucket = new Bucket("bucket", BucketArgs.builder()
            .bucket("metric-stream-test-bucket")
            .build());

        final var firehoseAssumeRole = IamFunctions.getPolicyDocument(GetPolicyDocumentArgs.builder()
            .statements(GetPolicyDocumentStatementArgs.builder()
                .principals(GetPolicyDocumentStatementPrincipalArgs.builder()
                    .type("Service")
                    .identifiers("firehose.amazonaws.com")
                    .build())
                .effect("Allow")
                .actions("sts:AssumeRole")
                .build())
            .build());

        var firehoseToS3Role = new Role("firehoseToS3Role", RoleArgs.builder()
            .assumeRolePolicy(firehoseAssumeRole.json())
            .build());

        var s3Stream = new FirehoseDeliveryStream("s3Stream", FirehoseDeliveryStreamArgs.builder()
            .extendedS3Configuration(FirehoseDeliveryStreamExtendedS3ConfigurationArgs.builder()
                .roleArn(firehoseToS3Role.arn())
                .bucketArn(bucket.arn())
                .build())
            .name("metric-stream-test-stream")
            .destination("extended_s3")
            .build());

        var main = new MetricStream("main", MetricStreamArgs.builder()
            .includeFilters(
                MetricStreamIncludeFilterArgs.builder()
                    .namespace("AWS/EC2")
                    .metricNames(
                        "CPUUtilization",
                        "NetworkOut")
                    .build(),
                MetricStreamIncludeFilterArgs.builder()
                    .namespace("AWS/EBS")
                    .metricNames()
                    .build())
            .name("my-metric-stream")
            .roleArn(metricStreamToFirehoseRole.arn())
            .firehoseArn(s3Stream.arn())
            .outputFormat("json")
            .build());

        // https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-metric-streams-trustpolicy.html
        final var metricStreamToFirehose = IamFunctions.getPolicyDocument(GetPolicyDocumentArgs.builder()
            .statements(GetPolicyDocumentStatementArgs.builder()
                .effect("Allow")
                .actions(
                    "firehose:PutRecord",
                    "firehose:PutRecordBatch")
                .resources(s3Stream.arn())
                .build())
            .build());

        var metricStreamToFirehoseRolePolicy = new RolePolicy("metricStreamToFirehoseRolePolicy", RolePolicyArgs.builder()
            .name("default")
            .role(metricStreamToFirehoseRole.id())
            .policy(metricStreamToFirehose.applyValue(_metricStreamToFirehose -> _metricStreamToFirehose.json()))
            .build());

        var bucketAcl = new BucketAcl("bucketAcl", BucketAclArgs.builder()
            .bucket(bucket.id())
            .acl("private")
            .build());

        final var firehoseToS3 = IamFunctions.getPolicyDocument(GetPolicyDocumentArgs.builder()
            .statements(GetPolicyDocumentStatementArgs.builder()
                .effect("Allow")
                .actions(
                    "s3:AbortMultipartUpload",
                    "s3:GetBucketLocation",
                    "s3:GetObject",
                    "s3:ListBucket",
                    "s3:ListBucketMultipartUploads",
                    "s3:PutObject")
                .resources(
                    bucket.arn(),
                    bucket.arn().applyValue(_arn -> String.format("%s/*", _arn)))
                .build())
            .build());

        var firehoseToS3RolePolicy = new RolePolicy("firehoseToS3RolePolicy", RolePolicyArgs.builder()
            .name("default")
            .role(firehoseToS3Role.id())
            .policy(firehoseToS3.applyValue(_firehoseToS3 -> _firehoseToS3.json()))
            .build());

    }
}
resources:
  main:
    type: aws:cloudwatch:MetricStream
    properties:
      includeFilters:
        - namespace: AWS/EC2
          metricNames:
            - CPUUtilization
            - NetworkOut
        - namespace: AWS/EBS
          metricNames: []
      name: my-metric-stream
      roleArn: ${metricStreamToFirehoseRole.arn}
      firehoseArn: ${s3Stream.arn}
      outputFormat: json
  metricStreamToFirehoseRole:
    type: aws:iam:Role
    name: metric_stream_to_firehose
    properties:
      name: metric_stream_to_firehose_role
      assumeRolePolicy: ${streamsAssumeRole.json}
  metricStreamToFirehoseRolePolicy:
    type: aws:iam:RolePolicy
    name: metric_stream_to_firehose
    properties:
      name: default
      role: ${metricStreamToFirehoseRole.id}
      policy: ${metricStreamToFirehose.json}
  bucket:
    type: aws:s3:Bucket
    properties:
      bucket: metric-stream-test-bucket
  bucketAcl:
    type: aws:s3:BucketAcl
    name: bucket_acl
    properties:
      bucket: ${bucket.id}
      acl: private
  firehoseToS3Role:
    type: aws:iam:Role
    name: firehose_to_s3
    properties:
      assumeRolePolicy: ${firehoseAssumeRole.json}
  firehoseToS3RolePolicy:
    type: aws:iam:RolePolicy
    name: firehose_to_s3
    properties:
      name: default
      role: ${firehoseToS3Role.id}
      policy: ${firehoseToS3.json}
  s3Stream:
    type: aws:kinesis:FirehoseDeliveryStream
    name: s3_stream
    properties:
      extendedS3Configuration:
        roleArn: ${firehoseToS3Role.arn}
        bucketArn: ${bucket.arn}
      name: metric-stream-test-stream
      destination: extended_s3
variables:
  # https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-metric-streams-trustpolicy.html
  streamsAssumeRole:
    fn::invoke:
      function: aws:iam:getPolicyDocument
      arguments:
        statements:
          - principals:
              - type: Service
                identifiers:
                  - streams.metrics.cloudwatch.amazonaws.com
            effect: Allow
            actions:
              - sts:AssumeRole
  # https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-metric-streams-trustpolicy.html
  metricStreamToFirehose:
    fn::invoke:
      function: aws:iam:getPolicyDocument
      arguments:
        statements:
          - effect: Allow
            actions:
              - firehose:PutRecord
              - firehose:PutRecordBatch
            resources:
              - ${s3Stream.arn}
  firehoseAssumeRole:
    fn::invoke:
      function: aws:iam:getPolicyDocument
      arguments:
        statements:
          - principals:
              - type: Service
                identifiers:
                  - firehose.amazonaws.com
            effect: Allow
            actions:
              - sts:AssumeRole
  firehoseToS3:
    fn::invoke:
      function: aws:iam:getPolicyDocument
      arguments:
        statements:
          - effect: Allow
            actions:
              - s3:AbortMultipartUpload
              - s3:GetBucketLocation
              - s3:GetObject
              - s3:ListBucket
              - s3:ListBucketMultipartUploads
              - s3:PutObject
            resources:
              - ${bucket.arn}
              - ${bucket.arn}/*

Additional Statistics

import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";

const main = new aws.cloudwatch.MetricStream("main", {
    statisticsConfigurations: [
        {
            includeMetrics: [{
                metricName: "CPUUtilization",
                namespace: "AWS/EC2",
            }],
            additionalStatistics: [
                "p1",
                "tm99",
            ],
        },
        {
            includeMetrics: [{
                metricName: "CPUUtilization",
                namespace: "AWS/EC2",
            }],
            additionalStatistics: ["TS(50.5:)"],
        },
    ],
    name: "my-metric-stream",
    roleArn: metricStreamToFirehose.arn,
    firehoseArn: s3Stream.arn,
    outputFormat: "json",
});
import pulumi
import pulumi_aws as aws

main = aws.cloudwatch.MetricStream("main",
    statistics_configurations=[
        {
            "include_metrics": [{
                "metric_name": "CPUUtilization",
                "namespace": "AWS/EC2",
            }],
            "additional_statistics": [
                "p1",
                "tm99",
            ],
        },
        {
            "include_metrics": [{
                "metric_name": "CPUUtilization",
                "namespace": "AWS/EC2",
            }],
            "additional_statistics": ["TS(50.5:)"],
        },
    ],
    name="my-metric-stream",
    role_arn=metric_stream_to_firehose["arn"],
    firehose_arn=s3_stream["arn"],
    output_format="json")
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Aws = Pulumi.Aws;

return await Deployment.RunAsync(() =>
{
    var main = new Aws.CloudWatch.MetricStream("main", new()
    {
        StatisticsConfigurations = new[]
        {
            new Aws.CloudWatch.Inputs.MetricStreamStatisticsConfigurationArgs
            {
                IncludeMetrics = new[]
                {
                    new Aws.CloudWatch.Inputs.MetricStreamStatisticsConfigurationIncludeMetricArgs
                    {
                        MetricName = "CPUUtilization",
                        Namespace = "AWS/EC2",
                    },
                },
                AdditionalStatistics = new[]
                {
                    "p1",
                    "tm99",
                },
            },
            new Aws.CloudWatch.Inputs.MetricStreamStatisticsConfigurationArgs
            {
                IncludeMetrics = new[]
                {
                    new Aws.CloudWatch.Inputs.MetricStreamStatisticsConfigurationIncludeMetricArgs
                    {
                        MetricName = "CPUUtilization",
                        Namespace = "AWS/EC2",
                    },
                },
                AdditionalStatistics = new[]
                {
                    "TS(50.5:)",
                },
            },
        },
        Name = "my-metric-stream",
        RoleArn = metricStreamToFirehose.Arn,
        FirehoseArn = s3Stream.Arn,
        OutputFormat = "json",
    });

});
package main

import (
	"github.com/pulumi/pulumi-aws/sdk/v7/go/aws/cloudwatch"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := cloudwatch.NewMetricStream(ctx, "main", &cloudwatch.MetricStreamArgs{
			StatisticsConfigurations: cloudwatch.MetricStreamStatisticsConfigurationArray{
				&cloudwatch.MetricStreamStatisticsConfigurationArgs{
					IncludeMetrics: cloudwatch.MetricStreamStatisticsConfigurationIncludeMetricArray{
						&cloudwatch.MetricStreamStatisticsConfigurationIncludeMetricArgs{
							MetricName: pulumi.String("CPUUtilization"),
							Namespace:  pulumi.String("AWS/EC2"),
						},
					},
					AdditionalStatistics: pulumi.StringArray{
						pulumi.String("p1"),
						pulumi.String("tm99"),
					},
				},
				&cloudwatch.MetricStreamStatisticsConfigurationArgs{
					IncludeMetrics: cloudwatch.MetricStreamStatisticsConfigurationIncludeMetricArray{
						&cloudwatch.MetricStreamStatisticsConfigurationIncludeMetricArgs{
							MetricName: pulumi.String("CPUUtilization"),
							Namespace:  pulumi.String("AWS/EC2"),
						},
					},
					AdditionalStatistics: pulumi.StringArray{
						pulumi.String("TS(50.5:)"),
					},
				},
			},
			Name:         pulumi.String("my-metric-stream"),
			RoleArn:      pulumi.Any(metricStreamToFirehose.Arn),
			FirehoseArn:  pulumi.Any(s3Stream.Arn),
			OutputFormat: pulumi.String("json"),
		})
		if err != nil {
			return err
		}
		return nil
	})
}
pulumi {
  required_providers {
    aws = {
      source = "pulumi/aws"
    }
  }
}

resource "aws_cloudwatch_metricstream" "main" {
  statistics_configurations {
    include_metrics {
      metric_name = "CPUUtilization"
      namespace   = "AWS/EC2"
    }
    additional_statistics = ["p1", "tm99"]
  }
  statistics_configurations {
    include_metrics {
      metric_name = "CPUUtilization"
      namespace   = "AWS/EC2"
    }
    additional_statistics = ["TS(50.5:)"]
  }
  name          = "my-metric-stream"
  role_arn      = metricStreamToFirehose.arn
  firehose_arn  = s3Stream.arn
  output_format = "json"
}
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.aws.cloudwatch.MetricStream;
import com.pulumi.aws.cloudwatch.MetricStreamArgs;
import com.pulumi.aws.cloudwatch.inputs.MetricStreamStatisticsConfigurationArgs;
import com.pulumi.aws.cloudwatch.inputs.MetricStreamStatisticsConfigurationIncludeMetricArgs;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;

public class App {
    public static void main(String[] args) {
        Pulumi.run(App::stack);
    }

    public static void stack(Context ctx) {
        var main = new MetricStream("main", MetricStreamArgs.builder()
            .statisticsConfigurations(
                MetricStreamStatisticsConfigurationArgs.builder()
                    .includeMetrics(MetricStreamStatisticsConfigurationIncludeMetricArgs.builder()
                        .metricName("CPUUtilization")
                        .namespace("AWS/EC2")
                        .build())
                    .additionalStatistics(
                        "p1",
                        "tm99")
                    .build(),
                MetricStreamStatisticsConfigurationArgs.builder()
                    .includeMetrics(MetricStreamStatisticsConfigurationIncludeMetricArgs.builder()
                        .metricName("CPUUtilization")
                        .namespace("AWS/EC2")
                        .build())
                    .additionalStatistics("TS(50.5:)")
                    .build())
            .name("my-metric-stream")
            .roleArn(metricStreamToFirehose.arn())
            .firehoseArn(s3Stream.arn())
            .outputFormat("json")
            .build());

    }
}
resources:
  main:
    type: aws:cloudwatch:MetricStream
    properties:
      statisticsConfigurations:
        - includeMetrics:
            - metricName: CPUUtilization
              namespace: AWS/EC2
          additionalStatistics:
            - p1
            - tm99
        - includeMetrics:
            - metricName: CPUUtilization
              namespace: AWS/EC2
          additionalStatistics:
            - TS(50.5:)
      name: my-metric-stream
      roleArn: ${metricStreamToFirehose.arn}
      firehoseArn: ${s3Stream.arn}
      outputFormat: json

Import

Identity Schema

Required

  • name (String) Name of the metric stream.

Optional

  • accountId (String) AWS Account where this resource is managed.
  • region (String) Region where this resource is managed.

Using pulumi import, import Metric Streams using name. For example:

$ pulumi import aws:cloudwatch/metricStream:MetricStream example example-stream

Constructors

MetricStream(String name, {MetricStreamArgs? args, CustomResourceOptions? options})
Creates a new MetricStream. name The Pulumi resource name. args Arguments used to configure this MetricStream. The set of arguments for MetricStream. options Resource options controlling this resource's behavior.
MetricStream.reference(String urn)
Creates a typed reference to an existing MetricStream resource.

Properties

arn ↔ Output<String>
ARN of the metric stream.
latefinal
childResources → Set<Resource>
finalinherited
completionSources ↔ Map<String, IOutputCompletionSource>
latefinalinherited
creationDate ↔ Output<String>
Date and time in RFC3339 format that the metric stream was created.
latefinal
excludeFilters ↔ Output<List<MetricStreamExcludeFilter>?>
List of exclusive metric filters. If you specify this parameter, the stream sends metrics from all metric namespaces except for the namespaces and the conditional metric names that you specify here. If you don't specify metric names or provide empty metric names whole metric namespace is excluded. Conflicts with includeFilter.
latefinal
firehoseArn ↔ Output<String>
ARN of the Amazon Kinesis Firehose delivery stream to use for this metric stream.
latefinal
hashCode → int
The hash code for this object.
no setterinherited
id ↔ Output<String>
getter/setter pairinherited
includeFilters ↔ Output<List<MetricStreamIncludeFilter>?>
List of inclusive metric filters. If you specify this parameter, the stream sends only the conditional metric names from the metric namespaces that you specify here. If you don't specify metric names or provide empty metric names whole metric namespace is included. Conflicts with excludeFilter.
latefinal
includeLinkedAccountsMetrics ↔ Output<bool?>
If you are creating a metric stream in a monitoring account, specify true to include metrics from source accounts that are linked to this monitoring account, in the metric stream. The default is false. For more information about linking accounts, see CloudWatch cross-account observability.
latefinal
isCustom → bool
Returns whether this resource is provider-managed.
no setterinherited
isProtected → bool
Returns whether this resource is protected from deletion.
no setterinherited
isRemote → bool
Whether this resource is registered as remote.
no setterinherited
isResourceReference → bool
Whether this instance represents a resource value returned over RPC.
finalinherited
lastUpdateDate ↔ Output<String>
Date and time in RFC3339 format that the metric stream was last updated.
latefinal
name ↔ Output<String>
Friendly name of the metric stream. If omitted, the provider will assign a random, unique name. Conflicts with namePrefix.
latefinal
namePrefix ↔ Output<String>
Creates a unique friendly name beginning with the specified prefix. Conflicts with name.
latefinal
outputFormat ↔ Output<String>
Output format for the stream. Possible values are json, opentelemetry0.7, and opentelemetry1.0. For more information about output formats, see Metric streams output formats.
latefinal
region ↔ Output<String>
Region where this resource will be managed. Defaults to the Region set in the provider configuration.
latefinal
resourceTransforms → List<ResourceTransform>
Inherited/explicit async transforms.
no setterinherited
roleArn ↔ Output<String>
ARN of the IAM role that this metric stream will use to access Amazon Kinesis Firehose resources. For more information about role permissions, see Trust between CloudWatch and Kinesis Data Firehose.
latefinal
runtimeType → Type
A representation of the runtime type of the object.
no setterinherited
state ↔ Output<String>
State of the metric stream. Possible values are running and stopped.
latefinal
statisticsConfigurations ↔ Output<List<MetricStreamStatisticsConfiguration>?>
For each entry in this array, you specify one or more metrics and the list of additional statistics to stream for those metrics. The additional statistics that you can stream depend on the stream's outputFormat. If the OutputFormat is json, you can stream any additional statistic that is supported by CloudWatch, listed in CloudWatch statistics definitions. If the OutputFormat is opentelemetry0.7 or opentelemetry1.0, you can stream percentile statistics (p99 etc.). See details below.
latefinal
tags ↔ Output<Map<String, String>?>
Map of tags to assign to the resource. If configured with a provider defaultTags configuration block present, tags with matching keys will overwrite those defined at the provider-level.
latefinal
tagsAll ↔ Output<Map<String, String>>
A map of tags assigned to the resource, including those inherited from the provider defaultTags configuration block.
latefinal
transformations → List<ResourceTransformation>
Inherited/explicit legacy transformations.
no setterinherited
urn ↔ Output<String>
latefinalinherited

Methods

failId(Object error) → void
Completes this resource ID with an error when registration fails.
inherited
failOutputs(Object error) → void
Completes all output properties with error.
inherited
failUrn(Object error) → void
Completes this resource URN with an error when registration fails.
inherited
getProvider(String moduleMember) → ProviderResource?
Returns provider for moduleMember's package, if configured.
inherited
getResourceName() → String
Returns this resource's logical name.
inherited
getResourceType() → String
Returns this resource's Pulumi type token.
inherited
noSuchMethod(Invocation invocation) → dynamic
Invoked when a nonexistent method or property is accessed.
inherited
registerOutput<T>(String propertyName, {Object? decoder(Object?)?, bool isSecret = false}) → Output<T>
Registers a dynamic output property for this resource.
inherited
resolveId(String? value, {required bool isKnown}) → void
Resolves the provider-assigned ID for this resource.
inherited
resolveOutputs(Struct outputs) → void
Resolves all output properties from a monitor response payload.
inherited
resolveUrn(String value) → void
Resolves this resource's URN once assigned by the engine.
inherited
serializeProperties(Map<String, dynamic> properties) → Future<Struct>
Serializes resource properties for RPC transmission.
inherited
toString() → String
A string representation of this object.
inherited

Operators

operator ==(Object other) → bool
The equality operator.
inherited

Static Methods

get(String name, Input<String> id, {MetricStreamState? state, CustomResourceOptions? options}) → MetricStream
Gets an existing MetricStream resource's state with the given name and id.