Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New resource aws_apprunner_observability_configuration #25591

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions .changelog/25591.txt
@@ -0,0 +1,3 @@
```release-note:new-resource
aws_apprunner_observability_configuration
```
1 change: 1 addition & 0 deletions internal/provider/provider.go
Expand Up @@ -998,6 +998,7 @@ func Provider() *schema.Provider {

"aws_apprunner_vpc_connector": apprunner.ResourceVPCConnector(),
"aws_apprunner_auto_scaling_configuration_version": apprunner.ResourceAutoScalingConfigurationVersion(),
"aws_apprunner_observability_configuration": apprunner.ResourceObservabilityConfiguration(),
"aws_apprunner_connection": apprunner.ResourceConnection(),
"aws_apprunner_custom_domain_association": apprunner.ResourceCustomDomainAssociation(),
"aws_apprunner_service": apprunner.ResourceService(),
Expand Down
246 changes: 246 additions & 0 deletions internal/service/apprunner/observability_configuration.go
@@ -0,0 +1,246 @@
package apprunner

import (
"context"
"fmt"
"log"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/apprunner"
"github.com/hashicorp/aws-sdk-go-base/v2/awsv1shim/v2/tfawserr"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
"github.com/hashicorp/terraform-provider-aws/internal/conns"
tftags "github.com/hashicorp/terraform-provider-aws/internal/tags"
"github.com/hashicorp/terraform-provider-aws/internal/verify"
)

func ResourceObservabilityConfiguration() *schema.Resource {
return &schema.Resource{
CreateWithoutTimeout: resourceObservabilityConfigurationCreate,
ReadWithoutTimeout: resourceObservabilityConfigurationRead,
UpdateWithoutTimeout: resourceObservabilityConfigurationUpdate,
DeleteWithoutTimeout: resourceObservabilityConfigurationDelete,

Importer: &schema.ResourceImporter{
StateContext: schema.ImportStatePassthroughContext,
},

Schema: map[string]*schema.Schema{
"arn": {
Type: schema.TypeString,
Computed: true,
},
"observability_configuration_name": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
"observability_configuration_revision": {
Type: schema.TypeInt,
Computed: true,
},
"latest": {
Type: schema.TypeBool,
Computed: true,
},
"trace_configuration": {
Type: schema.TypeList,
Optional: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"vendor": {
Type: schema.TypeString,
Optional: true,
ValidateFunc: validation.StringInSlice(apprunner.TracingVendor_Values(), false),
},
},
},
},
"status": {
Type: schema.TypeString,
Computed: true,
},
"tags": tftags.TagsSchema(),
"tags_all": tftags.TagsSchemaComputed(),
},

CustomizeDiff: verify.SetTagsDiff,
}
}

func resourceObservabilityConfigurationCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
conn := meta.(*conns.AWSClient).AppRunnerConn
defaultTagsConfig := meta.(*conns.AWSClient).DefaultTagsConfig
tags := defaultTagsConfig.MergeTags(tftags.New(d.Get("tags").(map[string]interface{})))

name := d.Get("observability_configuration_name").(string)

input := &apprunner.CreateObservabilityConfigurationInput{
ObservabilityConfigurationName: aws.String(name),
}

if v, ok := d.GetOk("trace_configuration"); ok && len(v.([]interface{})) > 0 && v.([]interface{})[0] != nil {
input.TraceConfiguration = expandTraceConfiguration(v.([]interface{}))
}

if len(tags) > 0 {
input.Tags = Tags(tags.IgnoreAWS())
}

output, err := conn.CreateObservabilityConfigurationWithContext(ctx, input)

if err != nil {
return diag.FromErr(fmt.Errorf("error creating App Runner Observability Configuration (%s): %w", name, err))
}

if output == nil || output.ObservabilityConfiguration == nil {
return diag.FromErr(fmt.Errorf("error creating App Runner Observability Configuration (%s): empty output", name))
}

d.SetId(aws.StringValue(output.ObservabilityConfiguration.ObservabilityConfigurationArn))

if err := WaitObservabilityConfigurationActive(ctx, conn, d.Id()); err != nil {
return diag.FromErr(fmt.Errorf("error waiting for App Runner Observability Configuration (%s) creation: %w", d.Id(), err))
}

return resourceObservabilityConfigurationRead(ctx, d, meta)
}

func resourceObservabilityConfigurationRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
conn := meta.(*conns.AWSClient).AppRunnerConn
defaultTagsConfig := meta.(*conns.AWSClient).DefaultTagsConfig
ignoreTagsConfig := meta.(*conns.AWSClient).IgnoreTagsConfig

input := &apprunner.DescribeObservabilityConfigurationInput{
ObservabilityConfigurationArn: aws.String(d.Id()),
}

output, err := conn.DescribeObservabilityConfigurationWithContext(ctx, input)

if !d.IsNewResource() && tfawserr.ErrCodeEquals(err, apprunner.ErrCodeResourceNotFoundException) {
log.Printf("[WARN] App Runner Observability Configuration (%s) not found, removing from state", d.Id())
d.SetId("")
return nil
}

if err != nil {
return diag.FromErr(fmt.Errorf("error reading App Runner Observability Configuration (%s): %w", d.Id(), err))
}

if output == nil || output.ObservabilityConfiguration == nil {
return diag.FromErr(fmt.Errorf("error reading App Runner Observability Configuration (%s): empty output", d.Id()))
}

if aws.StringValue(output.ObservabilityConfiguration.Status) == ObservabilityConfigurationStatusInactive {
if d.IsNewResource() {
return diag.FromErr(fmt.Errorf("error reading App Runner Observability Configuration (%s): %s after creation", d.Id(), aws.StringValue(output.ObservabilityConfiguration.Status)))
}
log.Printf("[WARN] App Runner Observability Configuration (%s) not found, removing from state", d.Id())
d.SetId("")
return nil
}

config := output.ObservabilityConfiguration
arn := aws.StringValue(config.ObservabilityConfigurationArn)

d.Set("arn", arn)
d.Set("observability_configuration_name", config.ObservabilityConfigurationName)
d.Set("observability_configuration_revision", config.ObservabilityConfigurationRevision)
d.Set("latest", config.Latest)
d.Set("status", config.Status)

if err := d.Set("trace_configuration", flattenTraceConfiguration(config.TraceConfiguration)); err != nil {
return diag.Errorf("error setting trace_configuration: %s", err)
}

tags, err := ListTags(conn, arn)

if err != nil {
return diag.FromErr(fmt.Errorf("error listing tags for App Runner Observability Configuration (%s): %s", arn, err))
}

tags = tags.IgnoreAWS().IgnoreConfig(ignoreTagsConfig)

//lintignore:AWSR002
if err := d.Set("tags", tags.RemoveDefaultConfig(defaultTagsConfig).Map()); err != nil {
return diag.FromErr(fmt.Errorf("error setting tags: %w", err))
}

if err := d.Set("tags_all", tags.Map()); err != nil {
return diag.FromErr(fmt.Errorf("error setting tags_all: %w", err))
}

return nil
}

func resourceObservabilityConfigurationUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
conn := meta.(*conns.AWSClient).AppRunnerConn

if d.HasChange("tags_all") {
o, n := d.GetChange("tags_all")

if err := UpdateTags(conn, d.Get("arn").(string), o, n); err != nil {
return diag.FromErr(fmt.Errorf("error updating App Runner Observability Configuration (%s) tags: %s", d.Get("arn").(string), err))
}
}

return resourceObservabilityConfigurationRead(ctx, d, meta)
}

func resourceObservabilityConfigurationDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
conn := meta.(*conns.AWSClient).AppRunnerConn

input := &apprunner.DeleteObservabilityConfigurationInput{
ObservabilityConfigurationArn: aws.String(d.Id()),
}

_, err := conn.DeleteObservabilityConfigurationWithContext(ctx, input)

if tfawserr.ErrCodeEquals(err, apprunner.ErrCodeResourceNotFoundException) {
return nil
}

if err != nil {
return diag.FromErr(fmt.Errorf("error deleting App Runner Observability Configuration (%s): %w", d.Id(), err))
}

if err := WaitObservabilityConfigurationInactive(ctx, conn, d.Id()); err != nil {
if tfawserr.ErrCodeEquals(err, apprunner.ErrCodeResourceNotFoundException) {
return nil
}
return diag.FromErr(fmt.Errorf("error waiting for App Runner Observability Configuration (%s) deletion: %w", d.Id(), err))
}

return nil
}

func expandTraceConfiguration(l []interface{}) *apprunner.TraceConfiguration {
if len(l) == 0 || l[0] == nil {
return nil
}

m := l[0].(map[string]interface{})

configuration := &apprunner.TraceConfiguration{}

if v, ok := m["vendor"].(string); ok && v != "" {
configuration.Vendor = aws.String(v)
}

return configuration
}

func flattenTraceConfiguration(traceConfiguration *apprunner.TraceConfiguration) []interface{} {
if traceConfiguration == nil {
return []interface{}{}
}

m := map[string]interface{}{
"vendor": aws.StringValue(traceConfiguration.Vendor),
}

return []interface{}{m}
}