mirror of
https://github.com/mulgadc/spinifex.git
synced 2026-10-23 04:36:40 +00:00
93db7e4d1b
* feat(ecs): ecs-agent skeleton + containerd image pull (Sprint 4c) Add the ecs-agent binary that runs inside an ECS container instance: it resolves host identity from IMDS, registers on the Layer-2 NATS bus, and heartbeats while alive. Image pulls go through a containerd-backed ImagePuller behind an interface, with an ECR resolver that mints GetAuthorizationToken creds from the instance role. Extract the IMDS-credential and ECR-auth flow out of ecr-credential-provider into internal/imdscreds and internal/ecrauth so the agent and the kubelet provider share one implementation. Add spinifex/handlers/ecs/bus as the single source of truth for Layer-2 subject builders and wire payloads, shared by the agent now and the scheduler in Sprint 4e. * build: pin genproto via replace to fix containerd/v2 ambiguous import go.opencensus.io -> grpc@v1.33.2 drags the pre-split monolithic genproto into the module graph; it still ships googleapis/rpc/status, which collides with the split genproto/googleapis/rpc module that containerd/ttrpc needs. The main module never imports the monolith, so a plain require bump is dropped by 'go mod tidy'. Pin it with a replace to a post-split version so the fix survives tidy and contributors can run 'go mod tidy' freely. * fix(ecs): agent boot failsafes from runtime verify - Build the ECR gateway HTTP client lazily on first image pull instead of at boot. A missing/malformed gateway CA no longer kills the agent before it can register + heartbeat, matching the best-effort containerd path. - Actively probe containerd with IsServing in runtime.New. The client dials lazily, so a dead socket previously slipped past the boot-time 'containerd unavailable' warn and only surfaced on the first pull. - Make the heartbeat interval configurable via ECS_HEARTBEAT_INTERVAL (default 30s) for test/verify and slow-link tuning.
37 lines
1.1 KiB
Go
37 lines
1.1 KiB
Go
// Package credentials supplies AWS SigV4 credentials to the ecs-agent. The agent
|
|
// signs gateway calls (ECR GetAuthorizationToken, instance register/heartbeat)
|
|
// with the host's instance-role credentials, fetched from IMDS and cached until
|
|
// near expiry.
|
|
package credentials
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
)
|
|
|
|
// Credentials is a SigV4 credential set with an expiry.
|
|
type Credentials struct {
|
|
AccessKeyID string
|
|
SecretAccessKey string
|
|
SessionToken string
|
|
Expiration time.Time
|
|
}
|
|
|
|
// Valid reports whether the credentials are usable now, leaving a margin so a
|
|
// caller does not start a request with a token about to expire mid-flight.
|
|
func (c Credentials) Valid(margin time.Duration) bool {
|
|
if c.AccessKeyID == "" || c.SecretAccessKey == "" {
|
|
return false
|
|
}
|
|
if c.Expiration.IsZero() {
|
|
return true
|
|
}
|
|
return time.Now().Add(margin).Before(c.Expiration)
|
|
}
|
|
|
|
// CredentialsProvider yields current credentials, refreshing as needed. Retrieve
|
|
// must be safe for concurrent use.
|
|
type CredentialsProvider interface {
|
|
Retrieve(ctx context.Context) (Credentials, error)
|
|
}
|