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.
nameThe Pulumi resource name.argsArguments used to configure this MetricStream. The set of arguments for MetricStream.optionsResource 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, andopentelemetry1.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
runningandstopped.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 isjson, you can stream any additional statistic that is supported by CloudWatch, listed in CloudWatch statistics definitions. If the OutputFormat isopentelemetry0.7oropentelemetry1.0, you can stream percentile statistics (p99 etc.). See details below.latefinal -
Map of tags to assign to the resource. If configured with a provider
defaultTagsconfiguration block present, tags with matching keys will overwrite those defined at the provider-level.latefinal -
A map of tags assigned to the resource, including those inherited from the provider
defaultTagsconfiguration 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
nameandid.