Lambda go refactor purge audit
Skill esaldgut/ai-native-engineering-workspace/global-skills/aws-go/lambda-go-refactor-purge-audit
After a refactor that REMOVES functionality from a Go Lambda (or any module with a go.mod), run go mod tidy and audit the dependency purge. If the purge drops an AWS SDK module (service/s3, service/cognitoidentityprovider, service/ses, ...), the lambda's IAM execution role is now over-provisioned — those actions are dead permissions. The go.mod delta is the objective, tool-detectable signal that the lambda's blast radius shrank, so it's the trigger to tighten IAM in the same PR or file tracked cleanup debt. Use whenever a PR deletes a feature/branch from a Go Lambda, or any time go mod tidy removes a github.com/aws/aws-sdk-go-v2/service/* direct dependency.From its SKILL.md
npx -y skills add esaldgut/ai-native-engineering-workspace --skill lambda-go-refactor-purge-auditAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
7.6 KB, ~1.6k tokens by cl100k_base, as published. Nobody here has run it
Refactor purge → IAM blast-radius audit
Two well-established practices, fused into one signal: (a) go mod tidy removes modules no longer
reachable in the import graph and adds missing ones
(Go Modules Reference); (b) the AWS Lambda
best practices say verbatim:
"Use most-restrictive permissions when setting IAM policies. Understand the resources and operations
your Lambda function needs, and limit the execution role to these permissions." The fusion: the
go mod tidy diff after a refactor is a proxy metric for IAM over-provisioning. When the refactor
removes the last call site for service/cognitoidentityprovider, go mod tidy purges that module —
and the cognito-idp:* actions on the execution role just became dead permissions nobody usually
revokes.
When to invoke
- A PR removes a feature or branch from a Go Lambda (or any module with a
go.mod). go mod tidyremoves a directgithub.com/aws/aws-sdk-go-v2/service/*dependency.- You're cutting a Lambda's scope and want the IAM role to track the new, smaller blast radius.
Announce on invoke: "Using lambda-go-refactor-purge-audit to treat the go mod tidy purge as the signal to tighten the over-provisioned IAM role."
The loop (close it — most teams don't)
- PR removes feature X from the Lambda (and its only use of
service/myservice). - Run
go mod tidy; reviewgit diff go.mod. - For each direct AWS SDK module removed, audit that lambda's execution-role policy for the
matching actions (
myservice:*). - Remove those actions in the same PR, or file a tracked cleanup ticket. The purge is the quantitative proof the blast radius shrank.
The trigger is objective — "go mod tidy diff includes service/<aws-name>" — not a vibes check.
Watch-outs (verified)
go mod tidyis conservative. It won't drop a module still reachable via a blank import_ "..."or a//go:build-guarded file you forgot. A "surviving" module masks the dead permission — grep for blank imports.// indirectremovals don't count. Only direct deps map to IAM actions your code calls. An// indirectline (a transitive dep) reflects the dependency graph, not your call sites — per the Go ref,// indirectmeans "no package from this module is directly imported by the main module."go.summay keep entries after ago.modpurge — benign for IAM auditing (you care aboutgo.moddirect deps), but don't readgo.sumas the signal.- One execution role per Lambda, or this breaks. If multiple Lambdas share a role (anti-pattern), stripping Cognito actions can break a sibling. The audit is clean only with per-Lambda roles.
- CDK-managed grants complicate it. If the policy comes from
table.grantReadWriteData(fn)/bucket.grantRead(fn)rather than a hand-writtenPolicyStatement, removing the SDK import won't shrink IAM until you also delete thegrant*()call — add that to the same PR.
Canonical example
# Baseline before the refactor.
go mod tidy
# ... refactor: delete feature X, which was the only user of service/myservice ...
go mod tidy
git diff go.mod
# Blast radius shrank if you see a DIRECT removal, e.g.:
# - github.com/aws/aws-sdk-go-v2/service/myservice v1.x.y
# (Ignore lines ending in `// indirect`.)
# Audit the lambda's execution-role policy for the now-dead actions.
aws iam list-attached-role-policies --role-name MyServiceLambdaExecRole
aws iam get-role-policy --role-name MyServiceLambdaExecRole --policy-name MyServiceInline
# Empirical cross-check: which actions were actually used recently?
aws iam generate-service-last-accessed-details \
--arn arn:aws:iam::123456789012:role/MyServiceLambdaExecRole
# then, with the returned JobId:
aws iam get-service-last-accessed-details --job-id <JobId>
# If "myservice" shows no recent access AND you just purged its SDK,
# drop myservice:* from the policy in THIS PR, or open a tracked cleanup ticket.
IAM Access Analyzer (unused-access findings) is the standing complement: even before the refactor,
an SDK imported but never called shows zero invocations and is already dead.
Anti-pattern to detect (greppable)
- A PR that deletes a feature but leaves
go.mod(and the IAM policy) untouched — rungo mod tidy. - A surviving
_ "github.com/aws/aws-sdk-go-v2/service/..."blank import after the feature is gone. - A CDK stack still calling
grant*()for a service the Lambda no longer imports.
Decision aid
- Direct AWS SDK module purged? → audit + tighten IAM (this PR or a ticket).
- Only
// indirectlines moved? → no IAM action; transitive graph churn only. - Module survived an obvious feature removal? → hunt a blank import or build-tag file before concluding "still needed."
Related skills
global-skills/aws-go/lambda-go-lazy-init-segregated/SKILL.md— removing a branch also removes itssync.Once/client; the two cleanups travel together.global-skills/aws-go/cdk-three-source-drift-check/SKILL.md— after tightening IAM in CDK, confirm the deployed role matches reality (no console-side drift) before declaring done.
Sources
- go mod tidy /
// indirect - Lambda best practices — most-restrictive IAM
- IAM Access Analyzer — unused access · generate-service-last-accessed-details
Last verified: 2026-06-03 against the Go Modules Reference (go mod tidy removes
no-longer-needed modules; // indirect = not directly imported) and the AWS Lambda best-practices
guide (live — "Use most-restrictive permissions when setting IAM policies"). IAM Access Analyzer
unused-access findings confirmed as the empirical complement.
Re-check after: AWS SDK Go v2 major / CDK CLI major, or by 2026-09-03. Decay risk: low
(go mod tidy and IAM least-privilege are stable).
Found a drift? Run /skill-pattern-freshness-audit aws-go.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.