v2.8.0
Summary
- Terraform AWS provider bumped to
6.65.0(from6.55.0) - New
s3filesAPI group, plus two newbedrockagentcoreresources - Credential cache improvements — the credentials cache now covers WebIdentity and
assume-role setups - Lower memory usage for provider pods
- Several bugfixes and dependency bumps
Field paths below apply to both the cluster-scoped (*.aws.upbound.io) and namespaced
(*.aws.m.upbound.io) variants of each resource unless a version is called out.
⚠️ Bugfix API change
Harness.bedrockagentcore — some spec fields moved to status
Following fields were configurable in the CRD but were never actually accepted as input by AWS.
They are gone from spec.forProvider / spec.initProvider and are now reported under
status.atProvider instead:
environment.agentcoreRuntimeEnvironment.agentRuntimeArn(and itsRef/Selector)environment.agentcoreRuntimeEnvironment.agentRuntimeIdenvironment.agentcoreRuntimeEnvironment.agentRuntimeNameenvironment.agentcoreRuntimeEnvironment.networkConfiguration.networkModeConfig.requireServiceS3Endpoint
Your resources keep working — nothing is lost. If your manifests set these fields, the API
server simply drops them on apply.
⚠️ If you have compositions or functions reading from
status.atProvider.environment or status.atProvider.memory, repoint them to the new
status.atProvider.environmentActual and status.atProvider.memoryActual, which now carry
the complete observed values.
Go module consumers only
⚠️All Harness.bedrockagentcore systemPrompt[].textSecretRef values are now a pointer
type. No YAML/API change, only Go code building or reading this field needs updating.
Other notable changes
directconnect — new 4-byte ASN field
BGPPeer, HostedPrivateVirtualInterface, HostedPublicVirtualInterface and
HostedTransitVirtualInterface gained bgpAsnLong, which supports 4-byte ASNs.
Exactly one of bgpAsn or bgpAsnLong may be set — setting both is now rejected.
Existing resources using only bgpAsn are unaffected.
⚠️ for ASNs in the old range (up to 2147483646), AWS reports the value back in the
bgpAsn field regardless of which one you set. If you create a resource with bgpAsnLong
using a small ASN, switch it to bgpAsn to avoid a resource that never settles.
RDS: new IAM permission needed for an opt-in field
Instance, Cluster and ClusterInstance in rds gained warningEventCategories. If you
set it, the provider needs rds:DescribeEvents on your ProviderConfig's IAM principal —
it isn't part of a typical RDS policy. The field only affects reporting, not your database.
Leave it unset and nothing changes.
Secret.secretsmanager — replica removal now actually happens
Clearing all replica entries used to be silently ignored, so the replicas stayed. That's
fixed. If you previously removed replica entries and assumed they were gone, they will
be deleted on the next reconcile. Check those resources before upgrading.
CatalogTable.glue — more fields get filled in automatically
Several storageDescriptor and viewDefinition fields are now returned by AWS, so
late-initialization will write AWS's values into your spec.forProvider if you left them
unset. Expect your stored manifests to gain fields you didn't write.
Deprecated fields
Still present and working, but plan to migrate:
| Resource | Deprecated | Use instead |
|---|---|---|
MemoryStrategy.bedrockagentcore
| spec.forProvider.namespaces
| spec.forProvider.namespaceTemplates
|
MemoryStrategy.bedrockagentcore
| spec.forProvider.memoryExecutionRoleArn
| the same field on the Memory resource
|
Switching namespaces to namespaceTemplates with the same value is a no-op — AWS mirrors
the two.
🆕 New resources
A new s3files API group:
| Resource | Group |
|---|---|
AccessPoint
| s3files
|
FileSystem
| s3files
|
FileSystemPolicy
| s3files
|
MountTarget
| s3files
|
SynchronizationConfiguration
| s3files
|
And two additions to bedrockagentcore:
| Resource | Group |
|---|---|
BrowserProfile
| bedrockagentcore
|
GatewayRule
| bedrockagentcore
|
🚀 Improvements
Extended credential cache for provider configs with assumeRoleChain configuration
The credentials cache was previously for only IRSA ProviderConfigs. It now also covers:
- Web identity ProviderConfigs
- Static credentials combined with an assume-role chain
- Web identity combined with an assume-role chain
Pod identity and Upbound sources are not cached yet.
Plain static credentials aren't cached, as they do not benefit.
If your credentials rotate outside the ProviderConfig — a Secret's contents change, a
projected token is refreshed — the cache notices and fetches fresh credentials. When in
doubt it refetches rather than reusing anything stale. Cached credentials also carry a
5-minute validity margin so long-running AWS calls don't fail on expiry, with jitter so
many ProviderConfigs don't all refresh at once.
Cache decisions are now logged with a clear reason and the ProviderConfig's name.
Lower memory usage
Provider pods now strip the large, unused schema section from the CRDs they cache, which
noticeably reduces memory.
🐞 Bug fixes
- Global Accelerator references now resolve.
EndpointGroup.listenerArnand
Listener.acceleratorArnwere resolving to the wrong value and never matched what the
field expected. Both now resolve correctly. Stack.appstreamnever stopped updating. AWS returns every default user setting even
when you specify only a few, which looked like a permanent difference. Resolved resources
now settle.fsxfile systems never stopped updating. An unsetfinalBackupTagsfield caused an
endless update loop onLustreFileSystem,OntapVolume,OpenzfsFileSystemand
WindowsFileSystem.Replicator.kafkacould be flagged for replacement on every reconcile after the new
Kafka cluster fields were added. Fixed.- Failed creates could publish a fake external name. For some resources, a create that
failed (often due to a permission that hadn't propagated yet) briefly wrote a placeholder
ID into thecrossplane.io/external-nameannotation — and other resources referencing
it could pick up that placeholder. Nothing is written now until the real ID exists. SynchronizationConfiguration.s3filesfailed on first create. It tried to update
instead of create. Fixed.Activity.sfnexternal names were malformed. The generated ARN used a/instead of
a:before the activity name, so it never matched the real AWS resource.ClusterAuth.eksnow works with more management policy combinations — any set that
includesCreate,UpdateandObserve.LateInitializeandDeleteare optional.
Upstream fixes that come with the provider bump
ReplicationGroup.elasticache— no longer shows a permanent difference when changes are
waiting for the next maintenance window.Broker.mq— no more phantomsharedResourcesdifference on ActiveMQ brokers.LustreFileSystem.fsx— no more permanent difference on data read cache size.CatalogTable.glue— no more permanent difference on validated Athena views.Stack.appstream—embedHostDomainsis now actually sent on update.App.amplify/Branch.amplify— clearing environment variables no longer errors out.RuleGroup.wafv2/WebACL.wafv2— header names containing.are accepted again.Instance.rds— restoring a multi-AZ SQL Server instance from a snapshot works.GlobalCluster.rds— re-creating the resource no longer hits a timing error.
🔁 Behavior changes worth knowing
Not breaking, but the resource behaves differently than before:
Harness.bedrockagentcoreretries its own failed creates. When AWS rejects the create
because an IAM role hasn't propagated yet, the provider deletes the partial resource and
tries again. Expect a longer time toReadyand extra delete/create pairs in CloudTrail —
worth knowing if you alert on unexpected deletions.- These no longer replace the resource, they update in place: enabling object lock on
Bucket.s3, lowering warm throughput onTable.dynamodb, changing
secondaryPrivateIpAddressCounton a privateNATGateway.ec2, and adding indexed keys to
Memory.bedrockagentcore. Indexed key ordering no longer matters either. MemoryStrategy.bedrockagentcorenow replaces the resource when you change itsname.Cluster.elasticacherejectstransitEncryptionEnabledfor Redis and Valkey before
calling AWS. AWS already rejected it — you just get the error sooner.Harness.bedrockagentcoremay report amodel.*.maxTokensvalue in status even if
you never set one.Codepipelinerejects setting bothoutputArtifactsand
outputArtifactsForComputeActionon the same action.
✨ New capabilities
Fields that are no longer required
Existing manifests stay valid; new ones can omit these:
| Resource | Field |
|---|---|
MemoryStrategy.bedrockagentcore
| namespaces
|
Harness.bedrockagentcore
| systemPrompt[].textSecretRef
|
PrivateVirtualInterface.directconnect, TransitVirtualInterface.directconnect
| bgpAsn
|
BGPPeer.directconnect, Hosted{Private,Public,Transit}VirtualInterface.directconnect
| bgpAsn
|
SecretRotation.secretsmanager
| rotationRules
|
AccessLogSubscription.vpclattice
| destinationArn
|
LBListenerRule.elbv2
| condition.sourceIp.values
|
New cross-resource references
You can now wire these fields with a Ref or Selector instead of hardcoding a value:
| Resource | Field | Points at |
|---|---|---|
PrivateVirtualInterface.directconnect
| dxGatewayId
| Gateway.directconnect
|
HostedPrivateVirtualInterfaceAccepter.directconnect
| dxGatewayId
| Gateway.directconnect
|
GatewayAssociation.directconnect
| proposalId
| GatewayAssociationProposal.directconnect
|
AccessLogSubscription.vpclattice
| destinationArn
| Bucket.s3
|
Server.transfer
| function
| Function.lambda
|
DataCatalogEncryptionSettings.glue
| catalogEncryptionServiceRole
| Role.iam
|
Scraper.amp
| OpenSearch exporter domainArn
| Domain.opensearch
|
MemoryStrategy.bedrockagentcore
| self-managed payload delivery bucket | Bucket.s3
|
MemoryStrategy.bedrockagentcore
| self-managed topicArn
| Topic.sns
|
SecretRotation.secretsmanager
| externalSecretRotationRoleArn
| Role.iam
|
Directory.workspaces
| access endpoint vpcEndpointId
| VPCEndpoint.ec2
|
Replicator.kafka
| log delivery log group / delivery stream / bucket | Group.cloudwatchlogs, DeliveryStream.firehose, Bucket.s3
|
OAuth2CredentialProvider.bedrockagentcore
| client secret secretId, on every vendor block
| Secret.secretsmanager
|
New fields
Paths are relative to spec.forProvider, and are mirrored on spec.initProvider and
status.atProvider unless noted. Nested additions under a listed parent aren't repeated.
From TF provider 6.63.0
| Kind.Group | New field(s) |
|---|---|
Scraper.amp
| destination.cloudwatch[].datasetArn, exporter[].opensearch[].domainArn
|
AutoscalingGroup.autoscaling
| instanceLifecyclePolicy.retentionTriggers.terminateHookAbandon
|
APIKeyCredentialProvider.bedrockagentcore
| apiKeySecretConfig.{secretId,jsonKey}, apiKeySecretSource — supply the API key from an existing Secrets Manager secret instead of inline
|
Oauth2CredentialProvider.bedrockagentcore
| oauth2ProviderConfig.{custom,github,google,microsoft,salesforce,slack}Oauth2ProviderConfig.clientSecretConfig.{secretId,jsonKey}, …clientSecretSource
|
GatewayTarget.bedrockagentcore
| targetConfiguration.mcp.mcpServer.{mcpToolSchema.*,resourcePriority}, targetConfiguration.mcp.connector.*, targetConfiguration.http.agentcoreRuntime.schema.source.*, targetConfiguration.http.passthrough.*, targetConfiguration.inference.{connector.source.connectorId,provider.*}
|
Harness.bedrockagentcore
| memory.disabled, memory.managedMemoryConfiguration.{encryptionKeyArn,eventExpiryDuration,strategies}; status-only environmentActual.*, memoryActual.*
|
MemoryStrategy.bedrockagentcore
| namespaceTemplates, configuration.reflection.*, configuration.selfManagedConfiguration.*, reflectionConfiguration.namespaceTemplates, memoryRecordSchema.metadataSchema.*
|
Codepipeline.codepipeline
| stage.action.commands, stage.action.outputArtifactsForComputeAction.{name,files} (mutually exclusive with stage.action.outputArtifacts — setting both now errors), stage.action.outputVariables
|
PrivateVirtualInterface.directconnect, TransitVirtualInterface.directconnect
| bgpAsnLong (32-bit ASN; use instead of bgpAsn), rateLimit, prefixPoolAllocatedCountIpv4, prefixPoolAllocatedCountIpv6
|
PublicVirtualInterface.directconnect, Hosted{Private,Public,Transit}VirtualInterface.directconnect
| rateLimit; hosted private/transit also gain status-only prefixPoolAllocatedCountIpv4 / …Ipv6
|
Hosted{Private,Transit}VirtualInterfaceAccepter.directconnect
| prefixPoolAllocatedCountIpv4, prefixPoolAllocatedCountIpv6
|
Connection.directconnect
| status-only state, prefixPoolSizeIpv4/…Ipv6, prefixPoolUnallocatedCountIpv4/…Ipv6, rateLimiterStatus.*
|
Lag.directconnect
| status-only rateLimiterStatus.{inUse,maxAllowed,remaining,totalBandwidth}
|
LifecyclePolicy.dlm
| policyDetails.parameters.excludeDataVolumeTags
|
FlowLog.ec2
| tagFieldSpecification[].{resourceType,tagKeys}
|
LaunchTemplate.ec2
| networkInterfaces.enaQueueCount
|
CapacityProvider.ecs
| managedInstancesProvider.instanceLaunchTemplate.capacityReservations.{reservationPreference,reservationGroupArn}, …localStorageConfiguration.useLocalStorage; RESERVED added as a valid capacityOptionType
|
Cluster.eks
| kubeApiServerConfig.{eventTtl,serviceNodePortRange.*}, kubeControllerManagerConfig.*, kubeSchedulerConfig.nodeResourcesFit.scoringStrategy.*
|
NodeGroup.eks
| warmPoolConfig.{minSize,maxGroupPreparedCapacity,poolState,reuseOnScaleIn}
|
PodIdentityAssociation.eks
| policy (inline session policy)
|
LBListenerRule.elbv2
| condition.sourceIp.ipAddressType
|
OntapFileSystem.fsx, WindowsFileSystem.fsx
| networkType
|
CatalogTableOptimizer.glue
| configuration[].compactionConfiguration[].icebergConfiguration[].{strategy,minInputFiles,deleteFileThreshold}
|
Cluster.kafka
| status-only bootstrapBrokersIpv6, bootstrapBrokersSaslIamIpv6, bootstrapBrokersSaslScramIpv6, bootstrapBrokersTlsIpv6
|
SecurityConfig.opensearchserverless
| iamFederationOptions.{userAttribute,groupAttribute}, iamIdentityCenterOptions.{instanceArn,userAttribute,groupAttribute}
|
Secret.secretsmanager
| type (managed external secrets)
|
SecretRotation.secretsmanager
| rotationEnabled (previously observation-only, now settable), externalSecretRotationMetadata[].{key,value,valueRef}, externalSecretRotationRoleArn
|
Service.vpclattice
| idleTimeoutSeconds
|
Directory.workspaces
| workspaceAccessProperties.accessEndpointConfig.{internetFallbackProtocols,accessEndpoints[].{accessEndpointType,vpcEndpointId}}
|
From TF provider 6.64.0
| Kind.Group | New field(s) |
|---|---|
HostedConfigurationVersion.appconfig
| versionLabel — optional label for the configuration version
|
Harness.bedrockagentcore
| model.litellmModelConfig (new model provider), model.{bedrock,gemini,openai}ModelConfig.additionalParams, model.{bedrock,openai}ModelConfig.apiFormat, skill[].{awsSkills,git,s3}
|
MetricAlarm.cloudwatch
| warmUpConfiguration — delays alarm evaluation after creation; the alarm stays in INSUFFICIENT_DATA and takes no actions during warm-up
|
CapacityProvider.ecs
| managedInstancesProvider.autoRepairConfiguration — ECS managed auto repair
|
Replicator.kafka (v1beta1)
| kafkaCluster[].{apacheKafkaCluster,clientAuthentication,encryptionInTransit}, replicationInfoList.{sourceKafkaClusterId,targetKafkaClusterId} — self-managed and on-premises Apache Kafka clusters are now usable as replication source or target, not just MSK
|
Instance.rds, Cluster.rds, ClusterInstance.rds
| warningEventCategories — requires rds:DescribeEvents, see the action-required section above
|
From TF provider 6.65.0
| Kind.Group | New field(s) |
|---|---|
OAuth2CredentialProvider.bedrockagentcore
| New provider vendors as sibling blocks under oauth2ProviderConfig, each carrying the same clientIdSecretRef / clientSecretSecretRef / clientSecretSource / clientSecretConfig / write-only set as the existing vendors: atlassianOauth2ProviderConfig (set credentialProviderVendor: AtlassianOauth2), linkedinOauth2ProviderConfig (LinkedinOauth2), and includedOauth2ProviderConfig — a generic block for AWS-known vendors (XOauth2, FacebookOauth2, SpotifyOauth2, …) that also exposes issuer, authorizationEndpoint, tokenEndpoint
|
OAuth2CredentialProvider.bedrockagentcore
| On oauth2ProviderConfig.customOauth2ProviderConfig: clientAuthenticationMethod (CLIENT_SECRET_BASIC / CLIENT_SECRET_POST / AWS_IAM_ID_TOKEN_JWT), onBehalfOfTokenExchangeConfig (RFC 8693 token exchange / RFC 7523 JWT grant), privateKeyJwtConfig, privateEndpoint (exactly one of managedVpcResource or selfManagedLatticeResource), privateEndpointOverride[], oauthDiscovery.authorizationServerMetadata.tokenEndpointAuthMethods
|
OAuth2CredentialProvider.bedrockagentcore
| On oauth2ProviderConfig.microsoftOauth2ProviderConfig: tenantIdSecretRef, tenantIdWoSecretRef, tenantIdWoVersion (Microsoft Entra tenant ID; the plain and write-only variants are mutually exclusive) — spec-only
|
OAuth2CredentialProvider.bedrockagentcore
| status-only: callbackUrl (register on the OAuth2 provider as an allowed redirect target), oauth2ProviderConfig.*.oauthDiscovery.authorizationServerMetadata.tokenEndpointAuthMethods
|
BGPPeer.directconnect, Hosted{Private,Public,Transit}VirtualInterface.directconnect
| bgpAsnLong — 4-byte-capable BGP ASN as an asplain decimal string, 1–4294967294. Exactly one of bgpAsn / bgpAsnLong — see the action-required section above
|
Upstream notes that isolated-tenant OAuth2 vendors (
OktaOauth2,PingOneOauth2,
OneLoginOauth2) still fail at create withMissing TokenEndpoint; support is planned
in a follow-up.
🔐 Dependency and security updates
| Dependency | v2.7.0 | v2.8.0 |
|---|---|---|
| Go toolchain | 1.26.5
| 1.26.8
|
google.golang.org/grpc
| v1.82.1
| v1.83.2
|
golang.org/x/net
| v0.57.0
| v0.59.0
|
golang.org/x/crypto
| v0.54.0
| v0.57.0
|
| Kubernetes libraries | v0.35.3
| v0.36.2
|
sigs.k8s.io/controller-runtime
| v0.23.3
| v0.24.1
|
| AWS SDK for Go v2 | v1.42.1
| v1.46.0
|
alpine runtime image
| 3.24.1
| 3.24.2
|
Full PR list
- fix(sfn): correct aws_sfn_activity ARN identifier format by @e-desouza in #2190
- Update go module directive to v1.26.6 by @renovate[bot] in #2192
- Update negz/create-tag action to v2 by @renovate[bot] in #2193
- Update to crossplane-runtime v2.4.0 by @jonasz-lasut in #2208
- Update go module directive to v1.26.7 by @renovate[bot] in #2201
- Add example manifest linter to CI by @sergenyalcin in #2214
- Add support for ClusterAuth managementPolicies always with Observe present by @jonasz-lasut in #2220
- Consume crossplane-runtime #1113 by @jonasz-lasut in #2221
- feat: bump TF provider to v6.63.0 by @erhancagirici in #2217
- Update go module directive to v1.26.8 by @renovate[bot] in #2219
- Update dependency kubernetes-sigs/kind to v0.33.0 by @renovate[bot] in #2215
- Update docker/setup-qemu-action action to v4.3.0 - autoclosed by @renovate[bot] in #2222
- Update dependency golangci/golangci-lint to v2.13.2 by @renovate[bot] in #2203
- feat: bump TF provider to v6.64.0 by @erhancagirici in #2228
- feat: add
BrowserProfileandGatewayRuleinbedrockagentcoregroup by @erhancagirici in #2230 - framework external names: treat stub identifiers as invalid by @erhancagirici in #2233
- feat: add
aws_s3files_*resources by @erhancagirici in #2234 - feat: extend credentials cache for AssumeRole configurations by @erhancagirici in #2212
- Add missing cross-resource references for
directconnectresources by @jonasz-lasut in #2236 - Update all non-major github action by @renovate[bot] in #2235
- feat: bump TF provider v6.65.0 by @erhancagirici in #2239
- Update alpine Docker tag to v3.24.2 by @renovate[bot] in #2242
New Contributors
- @e-desouza made their first contribution in #2190
Full Changelog: v2.7.0...v2.8.0