<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Kevin Eady</title>
    <description>The latest articles on Forem by Kevin Eady (@kevineady).</description>
    <link>https://forem.com/kevineady</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1001784%2F7f91240e-66ea-4126-aaac-1869df832512.jpeg</url>
      <title>Forem: Kevin Eady</title>
      <link>https://forem.com/kevineady</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/kevineady"/>
    <language>en</language>
    <item>
      <title>Deploy Amazon IVS Live Streams and Chat with Terraform</title>
      <dc:creator>Kevin Eady</dc:creator>
      <pubDate>Tue, 17 Jan 2023 17:09:15 +0000</pubDate>
      <link>https://forem.com/aws/deploy-amazon-ivs-live-streams-and-chat-with-terraform-3cml</link>
      <guid>https://forem.com/aws/deploy-amazon-ivs-live-streams-and-chat-with-terraform-3cml</guid>
      <description>&lt;p&gt;Infrastructure as Code (IaC) is a way to manage and provision infrastructure for a service through code, rather than manually through a user interface. This can include resources such as servers, load balancers, databases, network configuration, and more.&lt;/p&gt;

&lt;p&gt;By using code to manage infrastructure, teams can version control their infrastructure and make it easier to automate the provisioning and management of resources. This can be particularly helpful in large organizations with teams and complex infrastructure, as it allows for more consistent and predictable deployments. It can also make it easier to roll back changes if necessary.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.terraform.io/" rel="noopener noreferrer"&gt;Hashicorp Terraform&lt;/a&gt; is an open-source tool for building, changing, and versioning infrastructure safely and efficiently. Terraform can be used to manage many resource types including AWS resources through the &lt;a href="https://registry.terraform.io/providers/hashicorp/aws/latest/docs" rel="noopener noreferrer"&gt;AWS Provider&lt;/a&gt;. This guide will walk you through installing Terraform, creating an Amazon Interactive Video Service (Amazon IVS) Channel, enabling record to Amazon Simple Storage Service (Amazon S3), enabling Protected Channels, and creating an Amazon IVS Chat Room.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installing Terraform
&lt;/h3&gt;

&lt;p&gt;To begin, install Terraform following the guide from the &lt;a href="https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli#install-terraform" rel="noopener noreferrer"&gt;Terraform tutorial&lt;/a&gt;. This will enable you to use the &lt;code&gt;terraform&lt;/code&gt; command line interface to deploy infrastructure using code written in HashiCorp Configuration Language (HCL).&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating an AWS Account
&lt;/h3&gt;

&lt;p&gt;To use Amazon IVS, you must have an account. Amazon currently offers a free trial of Amazon IVS under the &lt;a href="https://aws.amazon.com/ivs/pricing/" rel="noopener noreferrer"&gt;AWS Free Tier for Amazon IVS&lt;/a&gt;. Upon initial sign-up for an AWS account, each month for the first 12 months new AWS customers receive 5 hours of basic input and 100 hours of SD video output each month - plus more.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Wondering what it’ll cost to run Amazon IVS in your production application? Check out the &lt;a href="https://ivs.rocks/calculator" rel="noopener noreferrer"&gt;Amazon IVS Cost Estimator&lt;/a&gt;!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Using the AWS Terraform Provider
&lt;/h3&gt;

&lt;p&gt;Terraform uses providers to enable interactions with APIs. The &lt;a href="https://registry.terraform.io/providers/hashicorp/aws/latest/docs" rel="noopener noreferrer"&gt;Terraform AWS Provider documentation&lt;/a&gt; provides details on authentication with AWS and configuration of the provider, such as region selection. It also provides guidelines and best practices around credential usage. &lt;/p&gt;

&lt;h2&gt;
  
  
  Using Terraform with Amazon IVS
&lt;/h2&gt;

&lt;p&gt;Terraform has full support for Amazon IVS beginning with version &lt;code&gt;v4.40.0&lt;/code&gt; of the AWS Terraform Provider using the following resources and data sources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Channels: &lt;a href="https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ivs_channel" rel="noopener noreferrer"&gt;&lt;code&gt;aws_ivs_channel&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Playback Key Pairs: &lt;a href="https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ivs_playback_key_pair" rel="noopener noreferrer"&gt;&lt;code&gt;aws_ivs_playback_key_pair&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Recording Configurations: &lt;a href="https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ivs_recording_configuration" rel="noopener noreferrer"&gt;&lt;code&gt;aws_ivs_recording_configuration&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Stream Key: &lt;a href="https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ivs_stream_key" rel="noopener noreferrer"&gt;&lt;code&gt;aws_ivs_stream_key&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Creating an Amazon IVS Channel
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ivs_channel" rel="noopener noreferrer"&gt;&lt;code&gt;aws_ivs_channel&lt;/code&gt;&lt;/a&gt; resource supports many arguments to configure the channel properties, such as enabling recording to S3 or requiring playback authorization. This resource has output attributes of the ingestion endpoint (&lt;a href="https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ivs_channel#ingest_endpoint" rel="noopener noreferrer"&gt;&lt;code&gt;ingest_endpoint&lt;/code&gt;&lt;/a&gt;) and the playback URL (&lt;a href="https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ivs_channel#playback_url" rel="noopener noreferrer"&gt;&lt;code&gt;playback_url&lt;/code&gt;&lt;/a&gt;).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="k"&gt;terraform&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;required_version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"&amp;gt;= 0.12"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;provider&lt;/span&gt; &lt;span class="s2"&gt;"aws"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;region&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"us-west-2"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_ivs_channel"&lt;/span&gt; &lt;span class="s2"&gt;"example"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"BASIC"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;data&lt;/span&gt; &lt;span class="s2"&gt;"aws_ivs_stream_key"&lt;/span&gt; &lt;span class="s2"&gt;"example"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;channel_arn&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_ivs_channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;arn&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;output&lt;/span&gt; &lt;span class="s2"&gt;"ingest_endpoint"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_ivs_channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ingest_endpoint&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;output&lt;/span&gt; &lt;span class="s2"&gt;"stream_key"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;aws_ivs_stream_key&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;output&lt;/span&gt; &lt;span class="s2"&gt;"playback_url"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_ivs_channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;playback_url&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;Note: Only Basic channel types are applicable in the AWS Free Tier.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When applying this configuration via &lt;code&gt;terraform apply&lt;/code&gt;, Terraform shows the infrastructure plan and will require a "&lt;code&gt;yes&lt;/code&gt;" user input to apply the configuration. The outputs (ingest endpoint, stream key, and playback url) are shown after applying the plan.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;➜  terraform apply

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
 + create
&amp;lt;= read (data resources)

Terraform will perform the following actions:

&lt;/span&gt;&lt;span class="gp"&gt; #&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;data.aws_ivs_stream_key.example will be &lt;span class="nb"&gt;read &lt;/span&gt;during apply
&lt;span class="gp"&gt; #&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;config refers to values not yet known&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;&amp;lt;= data "aws_ivs_stream_key" "example" {
     + arn         = (known after apply)
     + channel_arn = (known after apply)
     + id          = (known after apply)
     + tags        = (known after apply)
     + value       = (known after apply)
   }

&lt;/span&gt;&lt;span class="gp"&gt; #&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;aws_ivs_channel.example will be created
&lt;span class="go"&gt; + resource "aws_ivs_channel" "example" {
     + arn                         = (known after apply)
     + authorized                  = (known after apply)
     + id                          = (known after apply)
     + ingest_endpoint             = (known after apply)
     + latency_mode                = (known after apply)
     + name                        = (known after apply)
     + playback_url                = (known after apply)
     + recording_configuration_arn = (known after apply)
     + tags_all                    = (known after apply)
     + type                        = (known after apply)
   }

Plan: 1 to add, 0 to change, 0 to destroy.

Changes to Outputs:
 + ingest_endpoint = (known after apply)
 + playback_url    = (known after apply)
 + stream_key      = (known after apply)

Do you want to perform these actions?
 Terraform will perform the actions described above.
 Only 'yes' will be accepted to approve.

 Enter a value: yes

aws_ivs_channel.example: Creating...
aws_ivs_channel.example: Creation complete after 3s [id=arn:aws:ivs:us-west-2:326937407773:channel/EmVV0KxDONIR]
data.aws_ivs_stream_key.example: Reading...
data.aws_ivs_stream_key.example: Read complete after 1s [id=arn:aws:ivs:us-west-2:326937407773:stream-key/0Dy6pn6CQhMx]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Outputs:

ingest_endpoint = "a447f74b0a52.global-contribute.live-video.net"
playback_url = "https://a447f74b0a52.us-west-2.playback.live-video.net/api/video/v1/us-west-2.326937407773.channel.EmVV0KxDONIR.m3u8"
stream_key = "sk_us-west-xxxxxxxxxxxxx"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;With the ingest endpoint and stream key, head over to &lt;a href="https://stream.ivs.rocks/" rel="noopener noreferrer"&gt;Amazon IVS - Web Broadcast Tool&lt;/a&gt; to begin streaming. Click the "Open settings" gear icon near the bottom of the page...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjitmb67z4alstmnmmxng.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjitmb67z4alstmnmmxng.png" alt="Web Broadcast Tool - Open Settings" width="778" height="236"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;... and enter in the Ingest endpoint and Stream key:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0vp0nqmy3bivovh5jj0d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0vp0nqmy3bivovh5jj0d.png" alt="Web Broadcast Tool - Update Settings" width="800" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click "Save" and then the "Start Streaming" button:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwfel7jlzdb551b7tanns.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwfel7jlzdb551b7tanns.png" alt="Web Broadcast Tool - Start Streaming" width="800" height="155"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;... and your stream is live!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftptp6kzp68ulyfcj39gw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftptp6kzp68ulyfcj39gw.png" alt="Web Broadcast Tool - Live" width="800" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To view the stream, head over to &lt;a href="https://debug.ivsdemos.com/" rel="noopener noreferrer"&gt;Amazon IVS Player Tester&lt;/a&gt;. Click the gear icon in the upper right corner:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwqh507w7aktehd9ukqjf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwqh507w7aktehd9ukqjf.png" alt="Player Tester - Open Settings" width="800" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;... and add an Amazon IVS Player:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1thrbj69moksqkyu0f37.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1thrbj69moksqkyu0f37.png" alt="Player Tester - Add Amazon IVS Player" width="782" height="368"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enter the playback URL and click the "Load" button, and your live stream will begin playback:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn0v48vunw3eo7jluefof.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn0v48vunw3eo7jluefof.png" alt="Player Tester - Live Stream" width="800" height="566"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Modifying an Amazon IVS Channel to Add Record to S3
&lt;/h3&gt;

&lt;p&gt;This example creates a new S3 Bucket for use with the recording configuration, a recording configuration to specify the destination bucket and thumbnail properties, and assigns the recording configuration to the channel previously created. Modify the previous example configuration:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="p"&gt;provider "aws" {
&lt;/span&gt;   region = "us-west-2"
 }
&lt;span class="gi"&gt;+
+resource "aws_s3_bucket" "example" {
+  bucket_prefix = "tf-ivs-stream-archive-"
+  force_destroy = true
+}
+
+resource "aws_ivs_recording_configuration" "example" {
+  name = "tf-ivs-recording-configuration"
+  lifecycle {
+    create_before_destroy = true
+  }
+  thumbnail_configuration {
+    recording_mode = "INTERVAL"
+    target_interval_seconds = 30
+  }
+  destination_configuration {
+    s3 {
+      bucket_name = aws_s3_bucket.example.id
+    }
+  }
+}
+
&lt;/span&gt; resource "aws_ivs_channel" "example" {
  type = "BASIC"
&lt;span class="gi"&gt;+  recording_configuration_arn = aws_ivs_recording_configuration.example.arn
&lt;/span&gt; }
&lt;span class="err"&gt;
&lt;/span&gt; data "aws_ivs_stream_key" "example" {
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;Note: The &lt;a href="https://developer.hashicorp.com/terraform/language/meta-arguments/lifecycle#create_before_destroy" rel="noopener noreferrer"&gt;&lt;code&gt;create_before_destroy&lt;/code&gt;&lt;/a&gt; lifecycle option is needed for future modifications of the configuration that would cause the Recording Configuration to be deleted, as they cannot be updated in-place and must be recreated on modification. Recording Configurations cannot be deleted while a Channel uses it, so this option (on subsequent modifications) will update the Channel with a new Recording Configuration prior to deleting the old one.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;While streaming, Amazon IVS puts the contents of the stream inside an S3 bucket created. See &lt;a href="https://docs.aws.amazon.com/ivs/latest/userguide/record-to-s3.html" rel="noopener noreferrer"&gt;Auto-Record to Amazon S3 - Amazon Interactive Video Service&lt;/a&gt; for more information.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: Channels cannot be modified while they are live. Terraform will report an applicable &lt;code&gt;Unable to perform: ivs:UpdateChannel while resource: &amp;lt;arn&amp;gt; is live&lt;/code&gt; error if attempting to modify a live channel.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Creating an Amazon IVS Channel with Playback Authorization
&lt;/h3&gt;

&lt;p&gt;This examples creates a new asymmetric key pair using &lt;a href="https://aws.amazon.com/kms/" rel="noopener noreferrer"&gt;AWS Key Management Service (KMS)&lt;/a&gt;, creates a new Playback Key Pair using the key's public key material, and creates a channel requiring authorization:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_kms_key"&lt;/span&gt; &lt;span class="s2"&gt;"example"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt;              &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"KMS Key for Amazon IVS Playback"&lt;/span&gt;
  &lt;span class="nx"&gt;key_usage&lt;/span&gt;                &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"SIGN_VERIFY"&lt;/span&gt;
  &lt;span class="nx"&gt;customer_master_key_spec&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ECC_NIST_P384"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;data&lt;/span&gt; &lt;span class="s2"&gt;"aws_kms_public_key"&lt;/span&gt; &lt;span class="s2"&gt;"example"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;key_id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_kms_key&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;key_id&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_ivs_playback_key_pair"&lt;/span&gt; &lt;span class="s2"&gt;"example"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"tf-ivs-playback-key-pair"&lt;/span&gt;
  &lt;span class="nx"&gt;public_key&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;aws_kms_public_key&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;public_key_pem&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_ivs_channel"&lt;/span&gt; &lt;span class="s2"&gt;"example"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"tf-ivs-playback-key-pair-example"&lt;/span&gt;
  &lt;span class="nx"&gt;type&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"BASIC"&lt;/span&gt;
  &lt;span class="nx"&gt;authorized&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Authorized channels require a JWT &lt;code&gt;token&lt;/code&gt; URL parameter attached to the playback URL. See &lt;a href="https://docs.aws.amazon.com/ivs/latest/userguide/private-channels-generate-tokens.html" rel="noopener noreferrer"&gt;Generate and Sign Playback Tokens&lt;br&gt;
&lt;/a&gt; for more information.&lt;/p&gt;

&lt;p&gt;Here is an example Node.js (v18) console script to create a signed URL. This script requires the following Node modules installed via &lt;code&gt;npm&lt;/code&gt; or &lt;code&gt;yarn&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/@aws-sdk/client-kms" rel="noopener noreferrer"&gt;@aws-sdk/client-kms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/@aws-sdk/client-ivs" rel="noopener noreferrer"&gt;@aws-sdk/client-ivs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/ecdsa-sig-formatter" rel="noopener noreferrer"&gt;ecdsa-sig-formatter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;The script takes as arguments the &lt;code&gt;keyId&lt;/code&gt;, &lt;code&gt;channelArn&lt;/code&gt;, and expiration time as &lt;code&gt;expiresIn&lt;/code&gt;. Running the script with the infrastructure created from the Terraform configuration (found either by using &lt;code&gt;terraform show&lt;/code&gt; or adding outputs to the configuration file) will return a playback URL with a valid token appended:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;➜  node create-playback-url-with-token.mjs \
  --keyId 3df50d5f-054a-4f20-88c6-bb7a73306dd0 \
  --channelArn arn:aws:ivs:us-west-2:326937407773:channel/aVbMPCM9Il2x \
  --expiresIn 30

https://a447f74b0a52.us-west-2.playback.live-video.net/api/video/v1/us-west-2.326937407773.channel.aVbMPCM9Il2x.m3u8?token=eyJhbGciOiJFUzM4NCIsInR5cCI6IkpXVCJ9.eyJhd3M6Y2hhbm5lbC1hcm4iOiJhcm46YXdzOml2czp1cy13ZXN0LTI6MzI2OTM3NDA3NzczOmNoYW5uZWwvYVZiTVBDTTlJbDJ4IiwiYXdzOmFjY2Vzcy1jb250cm9sLWFsbG93LW9yaWdpbiI6IiIsImV4cCI6MTY3MzI3MzY5NCwiaWF0IjoxNjczMjczNjY0fQ.YAvlvVdO3rAq-7K3KHRPBvN1sU-JXJZ2963_thbaHBlBaYfyGYGAiqdJEN8XraEm3uc-h8NZiea8o0_XlOCHWIh9F1TGI1hSPqD7YY757C0ZF5cNsyBU49-sPbPvqpqa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Using Terraform with Amazon IVS Chat
&lt;/h2&gt;

&lt;p&gt;Terraform has full support for Amazon IVS Chat beginning with version &lt;code&gt;v4.41.0&lt;/code&gt; of the AWS Terraform Provider using the following resources and data sources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Logging Configuration: &lt;a href="https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ivschat_logging_configuration" rel="noopener noreferrer"&gt;&lt;code&gt;aws_ivschat_logging_configuration&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Room: &lt;a href="https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ivschat_room" rel="noopener noreferrer"&gt;&lt;code&gt;aws_ivschat_room&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Creating an Amazon IVS Chat Room
&lt;/h3&gt;

&lt;p&gt;An Amazon IVS Chat room can easily be created with the &lt;a href="https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ivschat_room" rel="noopener noreferrer"&gt;ivschat_room&lt;/a&gt; resource:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_ivschat_room"&lt;/span&gt; &lt;span class="s2"&gt;"example"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This room can be used with the Amazon IVS Chat product. See &lt;a href="https://docs.aws.amazon.com/ivs/latest/userguide/getting-started-chat.html" rel="noopener noreferrer"&gt;Getting Started with Amazon IVS Chat&lt;br&gt;
&lt;/a&gt; for more information and the &lt;a href="https://github.com/aws-samples/amazon-ivs-chat-web-demo" rel="noopener noreferrer"&gt;Amazon IVS Chat Web Demo&lt;/a&gt; where you can validate chat functionality using the resources created previously.&lt;/p&gt;
&lt;h3&gt;
  
  
  Creating an Amazon IVS Chat Room with Message Handler
&lt;/h3&gt;

&lt;p&gt;An &lt;a href="https://docs.aws.amazon.com/ivs/latest/userguide/chat-message-review-handler.html" rel="noopener noreferrer"&gt;Amazon IVS Chat Message Review Handler&lt;/a&gt; is a Lambda Function that allows modification and/or rejection of chat messages prior to delivery. This example creates a Lambda function, an IAM Role to allow Amazon IVS Chat to execute the function, and an Amazon IVS Chat Room using the function as a message review handler.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// index.js&lt;/span&gt;

&lt;span class="cm"&gt;/** Amazon IVS Chat message review handler */&lt;/span&gt;
&lt;span class="nx"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;handler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;Content&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;ReviewResult&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ALLOW&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;Content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;Content&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; - edited by Lambda`&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="c1"&gt;# main.tf&lt;/span&gt;

&lt;span class="k"&gt;data&lt;/span&gt; &lt;span class="s2"&gt;"aws_region"&lt;/span&gt; &lt;span class="s2"&gt;"current"&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="k"&gt;data&lt;/span&gt; &lt;span class="s2"&gt;"aws_caller_identity"&lt;/span&gt; &lt;span class="s2"&gt;"current"&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_iam_role"&lt;/span&gt; &lt;span class="s2"&gt;"example"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;               &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"tf-ivschat-message-handler-role"&lt;/span&gt;
  &lt;span class="nx"&gt;assume_role_policy&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
{
    "Version": "2012-10-17",
    "Statement": [{
        "Effect": "Allow",
        "Action": ["sts:AssumeRole"],
        "Principal": {"Service": "lambda.amazonaws.com"}
    }]
}
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;data&lt;/span&gt; &lt;span class="s2"&gt;"archive_file"&lt;/span&gt; &lt;span class="s2"&gt;"message_review_handler"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;type&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"zip"&lt;/span&gt;
  &lt;span class="nx"&gt;source_file&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;module}&lt;/span&gt;&lt;span class="s2"&gt;/index.js"&lt;/span&gt;
  &lt;span class="nx"&gt;output_path&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;module}&lt;/span&gt;&lt;span class="s2"&gt;/lambda-handler.zip"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_lambda_function"&lt;/span&gt; &lt;span class="s2"&gt;"example"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;filename&lt;/span&gt;         &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;archive_file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message_review_handler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;output_path&lt;/span&gt;
  &lt;span class="nx"&gt;function_name&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"tf-ivschat-message-handler"&lt;/span&gt;
  &lt;span class="nx"&gt;role&lt;/span&gt;             &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_iam_role&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;arn&lt;/span&gt;
  &lt;span class="nx"&gt;source_code_hash&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;archive_file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message_review_handler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;output_base64sha256&lt;/span&gt;
  &lt;span class="nx"&gt;runtime&lt;/span&gt;          &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"nodejs18.x"&lt;/span&gt;
  &lt;span class="nx"&gt;handler&lt;/span&gt;          &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"index.handler"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_lambda_permission"&lt;/span&gt; &lt;span class="s2"&gt;"example"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;action&lt;/span&gt;         &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"lambda:InvokeFunction"&lt;/span&gt;
  &lt;span class="nx"&gt;function_name&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_lambda_function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;function_name&lt;/span&gt;
  &lt;span class="nx"&gt;principal&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ivschat.amazonaws.com"&lt;/span&gt;
  &lt;span class="nx"&gt;source_account&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;aws_caller_identity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;account_id&lt;/span&gt;
  &lt;span class="nx"&gt;source_arn&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"arn:aws:ivschat:&lt;/span&gt;&lt;span class="k"&gt;${data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;aws_region&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="k"&gt;${data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;aws_caller_identity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;account_id&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:room/*"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_ivschat_room"&lt;/span&gt; &lt;span class="s2"&gt;"example"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"tf-ivschat-room"&lt;/span&gt;
  &lt;span class="nx"&gt;depends_on&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;aws_lambda_permission&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;example&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

  &lt;span class="nx"&gt;message_review_handler&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;uri&lt;/span&gt;             &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_lambda_function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;arn&lt;/span&gt;
    &lt;span class="nx"&gt;fallback_result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ALLOW"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Creating an Amazon IVS Chat Room with Logging
&lt;/h3&gt;

&lt;p&gt;Amazon IVS Chat supports logging of chat messages to several types of destinations, such as S3 Buckets or CloudWatch. This example creates an S3 Bucket for use with the logging configuration,&lt;br&gt;
and assigns the logging configuration to a created room:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_s3_bucket"&lt;/span&gt; &lt;span class="s2"&gt;"example"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;bucket_prefix&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"tf-ivschat-logging-"&lt;/span&gt;
  &lt;span class="nx"&gt;force_destroy&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_ivschat_logging_configuration"&lt;/span&gt; &lt;span class="s2"&gt;"example"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"tf-ivschat-logging-configuration"&lt;/span&gt;
  &lt;span class="nx"&gt;destination_configuration&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;s3&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;bucket_name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_s3_bucket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_ivschat_room"&lt;/span&gt; &lt;span class="s2"&gt;"example"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;                              &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"tf-ivschat-room"&lt;/span&gt;
  &lt;span class="nx"&gt;logging_configuration_identifiers&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;aws_ivschat_logging_configuration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;arn&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  In Closing
&lt;/h2&gt;

&lt;p&gt;With Terraform, developers can create configuration files to manage deployment of Amazon IVS and Amazon IVS Chat resources. Using IaC can provide teams several benefits, such as version control, collaboration, reusability, and disaster recovery. Browse through the &lt;a href="https://docs.aws.amazon.com/ivs/latest/userguide/what-is.html" rel="noopener noreferrer"&gt;Amazon IVS User Guide&lt;/a&gt; to explore all features related to Amazon IVS and Amazon IVS Chat.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>career</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
