Where AWS honours the condition#

Where the key is confirmed#

17 of 180 services in AWS’s Service Authorization Reference name aws:ResourceTag on their tagging action. That is a lower bound. The reference is authoritative about what it names and silent about what it omits, and AWS documents tag-based authorization for services it says nothing about, Lambda among them.

ServiceIAM prefixActions naming itOf total
EC2ec2495793
ResilienceHubresiliencehub57128
SESses48228
AutoScalingautoscaling4268
ECSecs3781
Kinesiskinesis3140
CertificateManageracm2041
CleanRoomscleanrooms12107
ElastiCacheelasticache1177
CloudWatchcloudwatch767
SageMakersagemaker7444
WorkSpacesworkspaces7101
KafkaConnectkafkaconnect218
AuditManagerauditmanager162
Batchbatch145
CURcur112
SSMQuickSetupssm-quicksetup114

Services with no verdict#

The reference states nothing either way for these. Check them against AWS’s own IAM documentation and test the policy. This is not a list of services where scoping fails.

ServiceIAM prefixActions
Connectconnect378
Glueglue304
IoTiot293
Bedrockbedrock260
BedrockAgentCorebedrock-agentcore250
DataZonedatazone247
IAMiam190
S3s3180
CloudFrontcloudfront173
DocDBrds169
Redshiftredshift166
SSMssm162
Lightsaillightsail161
Logslogs132
SecurityHubsecurityhub129
SSOsso126
DMSdms125
MediaLivemedialive125
Backupbackup122
GameLiftgamelift120
ServiceCatalogservicecatalog117
Lambdalambda116
SMSVOICEsms-voice114
Configconfig102
StorageGatewaystoragegateway97
NetworkManagernetworkmanager95
QBusinessqbusiness93
GuardDutyguardduty91
CodeCommitcodecommit90
ODBodb90
AppStreamappstream89
EMRelasticmapreduce88
AppSyncappsync87
Comprehendcomprehend85
NetworkFirewallnetwork-firewall84
Athenaathena81
DynamoDBdynamodb79
ElasticLoadBalancingelasticloadbalancing77
IVSivs77
ImageBuilderimagebuilder77
Rekognitionrekognition76
VpcLatticevpc-lattice75
WorkSpacesWebworkspaces-web75
Route53route5371
Transfertransfer71
EKSeks69
Route53Resolverroute53resolver69
RedshiftServerlessredshift-serverless68
CodeBuildcodebuild67
CloudTrailcloudtrail66
DataSyncdatasync66
Kendrakendra66
ControlTowercontroltower65
DirectConnectdirectconnect64
Locationgeo64
Organizationsorganizations63
WAFv2wafv261
ECRecr60
Eventsevents60
CEce59
AppConfigappconfig58
FSxfsx56
GlobalAcceleratorglobalaccelerator56
KMSkms56
S3Tabless3tables53
CodeArtifactcodeartifact51
ElasticBeanstalkelasticbeanstalk50
OpenSearchServerlessaoss49
CodeDeploycodedeploy48
S3Outpostss3-outposts48
MemoryDBmemorydb47
PaymentCryptographypayment-cryptography46
ApiGatewayapigateway44
CodePipelinecodepipeline44
XRayxray43
AppRunnerapprunner42
FMSfms42
Amplifyamplify41
Notificationsnotifications41
SNSsns41
ObservabilityAdminobservabilityadmin40
SSMContactsssm-contacts40
Chatbotchatbot39
Shieldshield39
StepFunctionsstates39
CodeConnectionscodeconnections38
CodeStarConnectionscodestar-connections38
EFSelasticfilesystem38
Inspectorinspector37
M2m237
ResourceExplorer2resource-explorer-237
Detectivedetective36
AppIntegrationsapp-integrations35
RAMram35
KinesisAnalyticskinesisanalytics34
MediaPackageV2mediapackagev234
ServiceDiscoveryservicediscovery33
Billingbilling32
Route53RecoveryReadinessroute53-recovery-readiness32
AppFlowappflow31
DevOpsGurudevops-guru31
SSMIncidentsssm-incidents31
SecurityLakesecuritylake31
VerifiedPermissionsverifiedpermissions31
DSQLdsql30
RolesAnywhererolesanywhere30
Cloud9cloud929
FISfis29
ResourceGroupsresource-groups29
Invoicinginvoicing26
EMRContainersemr-containers25
EMRServerlessemr-serverless25
Grafanagrafana25
ARCRegionSwitcharc-region-switch24
S3Filess3files24
ACMPCAacm-pca23
SecretsManagersecretsmanager23
Syntheticssynthetics22
DataPipelinedatapipeline21
RUMrum20
SQSsqs20
DocDBElasticdocdb-elastic19
MediaPackagemediapackage19
S3Vectorss3vectors19
Route53Profilesroute53profiles18
CodeGuruReviewercodeguru-reviewer17
IVSChativschat17
InternetMonitorinternetmonitor17
ARCZonalShiftarc-zonal-shift15
Oamoam15
ApplicationAutoScalingapplication-autoscaling14
Budgetsbudgets13
CodeStarNotificationscodestar-notifications13
Schedulerscheduler13
BCMDataExportsbcm-data-exports12
MWAAairflow12
Pipespipes10
Rbinrbin10
NotificationsContactsnotifications-contacts9
DLMdlm8

Types that carry no tags#

A marker needs somewhere to live, and a minority of admitted types take no tags argument at all. A condition on either marker key is unmatched on those, so a grant covering them is wider than its condition.

Being identifiable without a tag and being governable by one are different properties, and an IAM condition needs the second. live/MARKERS.md carries the generated count and the per-service breakdown.

What a run itself needs#

choudoufu makes few AWS calls of its own. Resource reads, writes and lists go through the provider plugin, so those are the AWS provider’s permissions, exactly as any OpenTofu run. Reference lists the fork’s own call surface per stage, which is short and fixed.

Marker stamping calls the tagging action for the resource’s own service. A role that can create a resource can usually already tag it, which matters when a policy is scoped tightly.

The rosters on this page are rendered from live/iam-reference.json, generated by tools/iamref-gen from AWS’s published reference. That artifact is authoritative about the condition keys it names and silent about the ones it omits.