← all lessons

Lesson 8

Resources

Resources

A resource is an entity with a stable identity. Instead of a loose bag of operations, you describe what the thing is — its identifiers — and bind lifecycle operations whose meaning Smithy understands.

resource City {
    identifiers: { cityId: CityId }
    read: GetCity
}

Lifecycle operations

Smithy knows these lifecycle verbs and validates their contracts:

  • Instance operations act on one identified resource: read, update, delete, put. Their input must include every identifier.
  • Collection operations act across instances: create, list.

For example, read must be @readonly, and its input must reference the resource’s identifier(s).

Target elision

Restating an identifier’s name and type in every operation is error-prone. Smithy 2.0 lets you elide it: input := for City brings the resource into scope, and $cityId pulls the member’s name and target from the resource, guaranteeing they match.

resource City {
    identifiers: { cityId: CityId }
    read: GetCity
}

string CityId

@readonly
operation GetCity {
    input := for City {
        @required
        $cityId
    }

    output := {
        @required
        name: String
    }
}

A service binds resources just like operations:

service CityService {
    version: "2024-01-01"
    resources: [
        City
    ]
}

Operations reachable through a bound resource don’t need to be listed under the service’s operations: — the resource binding pulls them in.

Your turn