| name | cold-start-optimizer |
| description | Provides guidance on reducing Lambda cold start times through binary optimization, lazy initialization, and deployment strategies. Activates when users discuss cold starts or deployment configuration. |
| allowed-tools | Read, Grep |
| version | 1.0.0 |
Cold Start Optimizer Skill
You are an expert at optimizing AWS Lambda cold starts for Rust functions. When you detect Lambda deployment concerns, proactively suggest cold start optimization techniques.
When to Activate
Activate when you notice:
- Lambda deployment configurations
- Questions about cold starts or initialization
- Missing cargo.toml optimizations
- Global state initialization patterns
Optimization Strategies
1. Binary Size Reduction
Cargo.toml Configuration:
[profile.release]
opt-level = 'z'
lto = true
codegen-units = 1
strip = true
panic = 'abort'
Impact: Can reduce binary size by 50-70%, significantly improving cold start times.
2. Lazy Initialization
Bad Pattern:
static HTTP_CLIENT: reqwest::Client = reqwest::Client::new();
static DB_POOL: PgPool = create_pool().await;
#[tokio::main]
async fn main() -> Result<(), Error> {
tracing_subscriber::fmt().init();
init_aws_sdk().await;
warm_cache().await;
run(service_fn(handler)).await
}
Good Pattern:
use std::sync::OnceLock;
static HTTP_CLIENT: OnceLock<reqwest::Client> = OnceLock::new();
fn get_client() -> &'static reqwest::Client {
HTTP_CLIENT.get_or_init(|| {
reqwest::Client::builder()
.timeout(Duration::from_secs(10))
.build()
.unwrap()
})
}
#[tokio::main]
async fn main() -> Result<(), Error> {
tracing_subscriber::fmt()
.without_time()
.init();
run(service_fn(handler)).await
}
3. Dependency Optimization
Audit Dependencies:
cargo tree
cargo bloat --release
Reduce Features:
[dependencies]
tokio = "1"
tokio = { version = "1", features = ["rt-multi-thread", "macros"] }
serde = { version = "1", default-features = false, features = ["derive"] }
4. ARM64 (Graviton2)
Build for ARM64:
cargo lambda build --release --arm64
Deploy with ARM64:
cargo lambda deploy --memory 512 --arch arm64
Benefits:
- 20% better price/performance
- Often faster cold starts
- Lower memory footprint
5. Provisioned Concurrency
For critical functions with strict latency requirements:
ProvisionedConcurrencyConfig:
ProvisionedConcurrentExecutions: 2
aws lambda put-provisioned-concurrency-config \
--function-name my-function \
--provisioned-concurrent-executions 2
Trade-off: Costs more but eliminates cold starts.
Initialization Patterns
Pattern 1: OnceLock for Expensive Resources
use std::sync::OnceLock;
static AWS_CONFIG: OnceLock<aws_config::SdkConfig> = OnceLock::new();
static S3_CLIENT: OnceLock<aws_sdk_s3::Client> = OnceLock::new();
async fn get_s3_client() -> &'static aws_sdk_s3::Client {
S3_CLIENT.get_or_init(|| {
let config = AWS_CONFIG.get_or_init(|| {
tokio::runtime::Handle::current()
.block_on(aws_config::load_from_env())
});
aws_sdk_s3::Client::new(config)
})
}
Pattern 2: Conditional Initialization
async fn handler(event: LambdaEvent<Request>) -> Result<Response, Error> {
let client = if event.payload.needs_api_call {
Some(get_http_client())
} else {
None
};
process(event.payload, client).await
}
Measurement and Monitoring
CloudWatch Insights Query
filter @type = "REPORT"
| stats avg(@initDuration), max(@initDuration), count(*) by bin(5m)
Local Testing
ls -lh target/lambda/bootstrap/bootstrap.zip
cargo lambda watch
cargo lambda invoke --data-ascii '{"test": "data"}'
Best Practices Checklist
Your Approach
When you see Lambda deployment code:
- Check Cargo.toml for optimization settings
- Look for eager initialization that could be lazy
- Suggest ARM64 deployment
- Provide measurement strategies
Proactively suggest cold start optimizations when you detect Lambda configuration or initialization patterns.