Homeβ€Ί Blogβ€Ί AWS Architecture Series #80 β€” Shared to an account, governed by its IAM…
AWS Architecture AWS Architecture Series

AWS Architecture Series #80 β€” Shared to an account, governed by its IAM

A resource share reads like a grant to the people in another account. It is a grant to the account. Which of that account's roles and users may act on the resource is decided by that account's own IAM, and the resource appears in their console as though it had always been theirs.

Verified against current vendor documentation on 12 October 2026. Pricing, limits and API behaviour were checked against the official docs on that date. Cloud services change fast — if you are reading this much later, treat the specifics as a starting point and re-check the linked sources.

Business Challenge

RAM has appeared in this series as a mechanism rather than a subject: #1 shared a Transit Gateway through it, #33 hit its invitation behaviour from the Lake Formation side, and #9 listed accepting a share as a provisioning step. This is the mechanism itself.

One sentence in the overview does most of the work, and it is easy to read past:

“When you share a resource in the owning account with another AWS account, the consuming account, you are granting access for principals in the consuming account to the shared resource. Any policies and permissions that apply to roles and users in the consuming account also apply to the shared resource.”

1You choose the account; the account chooses the person

A share associates a resource with principals, and AWS defines principals broadly: “Principals can be individual AWS accounts, the accounts in an organization or an organizational unit (OU) in AWS Organizations, or individual AWS Identity and Access Management (IAM) roles or users.”

With a caveat that decides which of those you can actually use: “Not all resource types can be shared with IAM roles and users.” So for a good many resource types the finest granularity available to the owner is the account.

From there the consuming account's own IAM decides who inside it may act, and that is a policy set in a different change-control process from yours. The owner is not blind — “The owners of a resource can see which principals have access to each individual resource that they have shared” — but what the owner sees is the principal the share names, which for most resource types is an account rather than the identity that will use it.

Fix

Treat the account boundary as the unit of trust you are actually granting to, and check whether your resource type supports role-level sharing before designing around it. Where it does not, the consuming account's IAM hygiene is part of your control surface.

2A resource policy grants the same access and hides the resource

Both mechanisms work. AWS says so plainly: “You can share some types of AWS resources with other AWS accounts by attaching a resource-based policy… However, sharing a resource by attaching a policy doesn't take advantage of the additional benefits that AWS RAM provides.”

The difference that matters most is not permission but discoverability. With RAM, “Users can see the resources shared with them directly in the originating AWS service console and API operations as if those resources were directly in the user's account” — AWS's example being a shared subnet appearing “in the Amazon VPC console and in the results of Amazon VPC API operations performed in that account”.

Whereas: “Resources shared by attaching a resource-based policy aren't visible this way; instead, you have to discover and explicitly refer to the resource by its Amazon Resource Name (ARN).”

So a resource-policy share is access that nobody can find by looking. It works for the team that was told the ARN, and it is invisible to the next engineer doing an inventory from the consuming side.

Fix

Use RAM when the consuming team should be able to see what they have. Reserve resource policies for cases where a specific external principal is addressed deliberately — and record the ARN somewhere a successor will find it.

3Deleting the share removes the access and leaves the resource

Two sentences, and the pairing is the point:

“When you delete a resource share, all principals that were associated with the resource share lose access to the shared resources.”

“Deleting a resource share doesn't delete the shared resources.”

Which is the correct separation — revoking access should not destroy data — and it means deletion is an instrument with a sharp edge in the other direction too: “You can't recover a resource share after you delete it.” The resource survives; the share, its principal list and its permissions do not.

There is also a confusing interval afterwards: “The deleted resource share disappears after two hours. Until then, it remains visible in the console with a deleted status.”

Fix

Script the share rather than clicking it, so deletion is recoverable from source even though it is not recoverable from the API. And read the status column during those two hours before concluding a deletion failed.

Architecture

One share, two accounts, and two independent permission decisions that have to agree before anything happens.

Diagram: what an AWS Resource Access Manager resource share confers on a consuming account, how that differs from achieving apparently the same thing with a resource-based policy, and what happens when the share is deleted. AWS states that when you share a resource in the owning account with another AWS account, the consuming account, you are granting access for principals in the consuming account to the shared resource, and that any policies and permissions that apply to roles and users in the consuming account also apply to the shared resource. So two independent permission decisions must agree: the owner decides which principals the share names, and the consuming account's own IAM decides which of its roles and users may act on the resource, and those two decisions sit in different change-control processes. Principals can be individual AWS accounts, the accounts in an organization or an organizational unit in AWS Organizations, or individual IAM roles or users, but AWS notes that not all resource types can be shared with IAM roles and users, so for many resource types the finest granularity available to the owner is the account. The owner is not blind, since owners of a resource can see which principals have access to each individual resource they have shared, but what the owner sees is the principal the share names rather than the identity that ultimately uses the resource. The resources in a share look like they are native resources in the accounts they are shared with. Comparing the two mechanisms: a resource-based policy can also share some types of resources with other accounts by identifying IAM principals outside the owning account, but AWS states that sharing by attaching a policy does not take advantage of the additional benefits RAM provides. The differences are that RAM lets you share with an organization or organizational unit without having to enumerate every one of the AWS account IDs; that with RAM users can see the resources shared with them directly in the originating service console and API operations as if those resources were directly in the user's account, with AWS's example being a shared VPC subnet appearing in the Amazon VPC console and in the results of VPC API operations performed in that account; and that resources shared by attaching a resource-based policy are not visible that way, so you have to discover and explicitly refer to the resource by its Amazon Resource Name. A resource-policy share is therefore access nobody can find by looking, working for the team that was told the ARN and invisible to the next engineer taking inventory from the consuming side. Resources already shared by a resource-based permission policy can be promoted to fully RAM managed resources using the PromoteResourceShareCreatedFromPolicy API operation or the equivalent promote-resource-share-created-from-policy CLI command. On acceptance, sharing with an account that is not part of your organization causes RAM to initiate an invitation process and the recipient must accept the invitation before that principal can access the shared resources, whereas after turning on the ability to share within your organization, sharing with accounts in the organization does not require invitations, which means the same API call produces a pending invitation in one case and immediate live access in the other depending on organization membership. Within the owning account, RAM simplifies granting access to every role and user in that account without having to use identity-based permission policies. On deletion, when you delete a resource share all principals that were associated with the resource share lose access to the shared resources, but deleting a resource share does not delete the shared resources, which is the correct separation because revoking access should not destroy data. AWS warns that you cannot recover a resource share after you delete it, so the resource survives while the share, its principal list and its permissions do not, making a scripted share recoverable from source even though it is not recoverable from the API. A deleted resource share disappears after two hours and until then remains visible in the console with a deleted status. If you need to delete an AWS resource that you included in a resource share, AWS recommends first ensuring that you either remove the resource from any resource share that includes it, or delete the resource share. On Region scoping, a resource share can contain only Regional resources that are in the same AWS Region as the resource share, and can contain global resources only if the resource share is in the designated home Region for global resources, US East Northern Virginia, us-east-1; because resource shares exist in specific Regions, to see shares containing global resources in the console you must set the Region to us-east-1, which means a share can appear to be missing simply because the console is pointed at the wrong Region.
The owner names the principal. The consuming account's IAM decides who acts.

Two permission decisions, two organisations

The sentence from the overview is worth decomposing, because it describes a conjunction rather than a grant:

Decided byWhat it decidesVisible to the owner?
The owning accountWhich principals the share names — accounts, OUs, or roles and users where supportedYes — owners “can see which principals have access”
The consuming accountWhich of its roles and users may act, via its own IAMNo — it is that account's policy set

Both have to permit the call. That is familiar from #35, where a cross-account request needs the resource side and the identity side to agree. What is different here is the direction of ignorance: in a resource-policy world the owner writes the condition and can therefore reason about it; with a RAM share to an account, the second half of the conjunction is authored by somebody else entirely.

Within the owning account, the share is broader than you might expect

“Within the account that owns the resource, AWS RAM simplifies granting access to every role and user in that account without having to use identity-based permission policies.”

Listed as a benefit, and it is one β€” the owning account does not need to write identity policies to make its own resource usable. It is also worth reading as a statement of scope: the mechanism's natural grain is "everyone in the account", and narrowing it is work you add rather than work you remove.

Why the resource looks native, and why that matters

“The resources in the share look like they're native resources in the AWS accounts you shared them with.”

This is the single best thing about RAM and the thing most likely to mislead. An engineer in the consuming account sees a subnet in their VPC console. It is listed with their own subnets. Their IAM governs what they can do with it. Nothing in the normal workflow announces that deleting their VPC will not delete this subnet, or that the owner can withdraw it at any moment by deleting a share in another account.

The native appearance is deliberate and correct — it is why RAM beats passing ARNs around — and it makes "which of these resources do we actually own?" a question the console does not foreground.

Acceptance depends on organisation membership

“If you share resources with an account that isn't part of your organization, then AWS RAM initiates an invitation process. The recipient must accept the invitation before that principal can access the shared resources.”

And the other case: “After you turn on the ability to share within your organization, sharing with accounts in the organization doesn't require invitations.”

So the same API call has two different outcomes depending on a property of the target: a pending invitation, or live access immediately. #33 ran into the same split from the Lake Formation side, where a cross-account grant behaves differently by relationship. Worth knowing when automating: a share that "did not work" may be a share awaiting acceptance.

The promotion path, for shares you did not know you had

“If you have resources that you have shared by using a resource-based permission policy, you can promote those resources to fully AWS RAM managed resources” — via PromoteResourceShareCreatedFromPolicy, or the CLI equivalent promote-resource-share-created-from-policy.

The operation name is the interesting part: a share created from policy. Sharing by resource policy produces something RAM already models, in a not-fully-managed state, and promotion converts it. Which means an inventory of RAM shares and an inventory of cross-account access are not the same list until you have gone looking for the resource policies too.

Region scoping, with one global exception

RuleConsequence
“A resource share can contain only Regional resources that are in the same AWS Region as the resource share”A multi-Region estate needs a share per Region, each with its own principal list to keep in step
“can contain global resources only if the resource share is in the designated home Region for global resources, US East (N. Virginia), us-east-1”Global resource sharing happens in one Region whether or not you work there
“to see resource shares that contain global resources, you must set the AWS Region to US East (N. Virginia), (us-east-1)”A share can look missing because the console is pointed elsewhere

That third row is a support ticket waiting to happen, and it is the same class of problem as everything in this block: the absence of a row reads as "no such thing" when it means "not in this view".

Why This Architecture Holds Up

Separating the share from the resource is the right call

“Deleting a resource share doesn't delete the shared resources.” The alternative — revocation that destroys — would make withdrawing access an operation nobody would dare perform. Keeping them separate means access can be withdrawn promptly and reversibly from the resource's point of view.

The corollary is the ordering advice AWS gives for the other direction: “If you need to delete an AWS resource that you included in a resource share, AWS recommends that you first ensure that you either remove the resource from any resource share that includes it, or delete the resource share.” Delete the resource first and you leave a share referring to something gone, which is a tidiness problem rather than a security one, and still worth avoiding.

Sharing to an OU is the feature that justifies the service

“You can share with an organization or an organizational unit (OU) without having to enumerate every one of the AWS account IDs.”

This is the operational argument, and it compounds with account vending. A share scoped to an OU covers accounts that do not exist yet — so an account created by Control Tower next month inherits the Transit Gateway attachment capability without anybody editing a share. The flip side is that the membership of that OU is now a permission boundary, and moving an account between OUs changes what it can reach.

The two-hour window after deletion is an observability trap

“The deleted resource share disappears after two hours. Until then, it remains visible in the console with a deleted status.”

Access is gone the moment the share is deleted β€” “all principals that were associated with the resource share lose access” β€” while the share object lingers for two hours. So during that window the console shows an object that no longer does anything, and an automation that polls for the share's absence to confirm revocation will wait two hours for a state change that was already complete.

Confirm revocation by checking the status field, or from the consuming side, rather than by waiting for the row to vanish.

The resource-policy comparison is honest about both sides

AWS does not claim resource policies do not work. It says they do not get you the RAM features, and it lists them: OU-level targeting, native visibility, owner-side principal visibility, and the invitation workflow. That is a fair account, and it leaves the genuine case for resource policies intact — addressing one named external principal on a resource type RAM may not support.

The feature worth weighing most heavily is the visibility one, because its absence is silent. A resource policy grant is invisible from the consuming console and, unless somebody keeps a register, invisible to the consuming organisation entirely. The access is real either way; only one of the two mechanisms tells the recipient what they have.

Key Architecture Decisions

Decision Choice Reasoning
Unit of trust The consuming account, unless your resource type supports roles “Not all resource types can be shared with IAM roles and users.”
Who may use a shared resource Accept that the consuming account decides “Any policies and permissions that apply to roles and users in the consuming account also apply.”
RAM share or resource policy RAM, when the recipient should be able to find the resource Policy-shared resources “aren't visible this way” and need the ARN.
Auditing cross-account access List RAM shares and resource policies PromoteResourceShareCreatedFromPolicy exists because the two are different inventories.
Targeting Share to an OU where the intent is structural No need to “enumerate every one of the AWS account IDs”, and new accounts inherit it.
OU membership Treat it as a permission boundary Moving an account between OUs changes what shares reach it.
Automating a share Handle the invitation case explicitly Outside the organisation the recipient “must accept the invitation”; inside it, no invitation.
Revoking access Delete the share, and know the resource stays Principals “lose access”; “Deleting a resource share doesn't delete the shared resources.”
Confirming revocation Check status, not absence The share object “disappears after two hours” while access ends immediately.
Share definitions Keep them in code You “can't recover a resource share after you delete it”.
Deleting a shared resource Remove it from shares first AWS's own recommended ordering.
Global resources Work in us-east-1 It is the “designated home Region for global resources”, for creating and for viewing.

The audit worth running

List your resource shares in every Region you operate in, plus us-east-1 whether you operate there or not. Then, separately, list the resource-based policies on shareable resource types that name external principals. The second list is the one nobody maintains, and the existence of a promotion API is AWS telling you it is a different list.

For each share, write down the principal type. Every share whose principal is an account rather than a role is a grant whose effective membership is maintained by somebody else — which may be entirely fine, and should be a known fact rather than a discovered one.

Closing Thought

RAM is one of the better-designed services in this block. The native appearance of shared resources removes real friction, OU targeting makes sharing survive account vending, and the separation of share from resource means revocation is safe to perform. None of the findings here are defects.

They are consequences of the model, and the model is that a share is a grant to an account. The owner picks the account and the account picks the person, so the complete answer to "who can use this resource" lives in two places under two different kinds of governance. The console in the consuming account shows the resource as theirs, which is the point, and which also means nothing in the normal view distinguishes a resource you own from one you have been lent.

That makes a tidy end to this run. #78 was a revocation that your own verifier never hears about. #79 was a decision whose explanation arrives in fields the caller discards. This one is access whose other half is administered by an organisation you do not control. Three different shapes of the same practical question: when you want to know who can do something, which system actually holds the answer — and is it yours?

Next in this series

Security & Identity — AWS Organizations service control policies and resource control policies side by side: what each can and cannot reach, how they combine with an identity policy, and why neither grants anything.

Comments

How was your experience?
Your feedback helps improve this site.
PoorExcellent