-
Notifications
You must be signed in to change notification settings - Fork 105
feat: add AWS Lambda Managed Instances (LMI) skill to aws-serverless plugin #140
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
sbbhimji
wants to merge
12
commits into
awslabs:main
Choose a base branch
from
sbbhimji:feature/aws-lambda-managed-instances
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from 4 commits
Commits
Show all changes
12 commits
Select commit
Hold shift + click to select a range
afc4dfe
feat: add AWS Lambda Managed Instances (LMI) skill to aws-serverless …
sbbhimji 2ca247b
feat: register LMI skill in serverless plugin and update cross-refere…
sbbhimji 422c422
Merge branch 'main' into feature/aws-lambda-managed-instances
krokoko 9d13eae
Merge branch 'main' into feature/aws-lambda-managed-instances
krokoko 6645a69
fix(aws-serverless): address PR feedback and correct LMI concurrency …
sbbhimji e465e5b
fix(aws-serverless): address Leandro's feedback on Powertools .NET an…
sbbhimji 12a006b
fix(aws-serverless): simplify cost reference and remove VPC endpoint …
sbbhimji deb4f5d
fix: resolve merge conflict in README.md plugins table
sbbhimji 733dec9
fix(aws-serverless): fix markdown lint errors (blank lines around fen…
sbbhimji 17fe66b
fix(aws-serverless): run dprint fmt to fix table formatting
sbbhimji 54e5d53
fix: run dprint fmt on README.md table alignment
sbbhimji 56b3687
Merge branch 'main' into feature/aws-lambda-managed-instances
krokoko File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Some comments aren't visible on the classic Files Changed page.
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -8,6 +8,8 @@ | |
| "aws", | ||
| "lambda", | ||
| "durable functions", | ||
| "managed-instances", | ||
| "lmi", | ||
| "serverless", | ||
| "development", | ||
| "sam", | ||
|
|
||
205 changes: 205 additions & 0 deletions
205
plugins/aws-serverless/skills/aws-lambda-managed-instances/SKILL.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,205 @@ | ||
| --- | ||
| name: aws-lambda-managed-instances | ||
| description: > | ||
| Evaluate, configure, and migrate workloads to AWS Lambda Managed Instances (LMI). | ||
| Triggers on: Lambda Managed Instances, LMI, capacity provider, multi-concurrency Lambda, | ||
| dedicated instance Lambda, EC2-backed Lambda, cold start elimination, Graviton Lambda, | ||
| instance type for Lambda, Lambda cost optimization with Reserved Instances or Savings Plans. | ||
| Also trigger when users describe high-volume predictable workloads seeking cost savings, | ||
| or compare Lambda vs EC2 for steady-state traffic. For standard Lambda without LMI, | ||
| use the aws-lambda skill instead. | ||
| argument-hint: "[describe your workload or what you need help with]" | ||
| metadata: | ||
| tags: lambda, lmi, managed-instances, ec2, capacity-provider, multi-concurrency, cost-optimization | ||
| --- | ||
|
|
||
| # AWS Lambda Managed Instances (LMI) | ||
|
|
||
| Run Lambda functions on current-generation EC2 instances in your account while AWS manages provisioning, patching, scaling, routing, and load balancing. Combines Lambda's developer experience with EC2's pricing and hardware options. | ||
|
|
||
| For standard Lambda development, see [aws-lambda skill](../aws-lambda/). For SAM/CDK deployment, see [aws-serverless-deployment skill](../aws-serverless-deployment/). | ||
|
|
||
| ## When to Load Reference Files | ||
|
|
||
| - **Cost comparison**, **pricing analysis**, **Lambda vs LMI cost**, **Savings Plans**, or **Reserved Instances** -> see [references/cost-comparison.md](references/cost-comparison.md) | ||
| - **Instance types**, **memory sizing**, **vCPU ratios**, **scaling tuning**, or **capacity provider config** -> see [references/configuration-guide.md](references/configuration-guide.md) | ||
| - **Thread safety**, **code review checklist**, or **multi-concurrency readiness** -> see [references/thread-safety.md](references/thread-safety.md) | ||
| - **Before/after code examples**, **runtime-specific migration** (Node.js, Python, Java, .NET), or **connection pooling** -> see [references/migration-patterns.md](references/migration-patterns.md) | ||
| - **IAM roles**, **VPC setup**, **CLI commands**, **SAM template**, or **CDK example** -> see [references/infrastructure-setup.md](references/infrastructure-setup.md) | ||
|
sbbhimji marked this conversation as resolved.
Outdated
|
||
| - **Errors**, **throttling**, **debugging**, or **stuck deployments** -> see [references/troubleshooting.md](references/troubleshooting.md) | ||
|
|
||
| ## Quick Decision: Is LMI Right for This Workload? | ||
|
|
||
| | Signal | LMI is a strong fit | Standard Lambda is better | | ||
| |--------|---------------------|---------------------------| | ||
| | Traffic | Steady, predictable, 50M+ req/mo | Bursty, unpredictable, long idle | | ||
| | Cost | Duration-heavy spend at scale | Low or sporadic invocations | | ||
| | Cold starts | Unacceptable (LMI has zero) | Tolerable or mitigated by SnapStart | | ||
|
sbbhimji marked this conversation as resolved.
Outdated
|
||
| | Compute | Latest CPUs, specific families, high network BW | Standard Lambda memory/CPU sufficient | | ||
|
sbbhimji marked this conversation as resolved.
Outdated
|
||
| | Compliance | Single-tenant required, VPC control | Multi-tenant Firecracker acceptable | | ||
|
sbbhimji marked this conversation as resolved.
Outdated
|
||
| | Scale-to-zero | Not needed (min 3 instances always run) | Required (pay nothing when idle) | | ||
| | Code readiness | Thread-safe or feasible to refactor | Non-thread-safe, expensive to change | | ||
|
|
||
| ## Instructions | ||
|
|
||
| ### Step 1: Assess the Workload | ||
|
|
||
| Gather these signals before recommending: | ||
|
|
||
| 1. **Traffic pattern**: Steady vs bursty? Requests per second? | ||
| 2. **Current costs**: Monthly Lambda spend? Existing Savings Plans? | ||
| 3. **Runtime**: Node.js, Java, .NET, or Python? | ||
| 4. **Memory/CPU**: How much memory? CPU-bound or I/O-bound? | ||
| 5. **Execution duration**: Average and P99? | ||
| 6. **Thread safety**: Mutable globals, shared `/tmp` paths, non-thread-safe libs? | ||
| 7. **VPC**: Already in a VPC? Private resource access needed? | ||
|
|
||
| ### Step 2: Build the Cost Comparison | ||
|
|
||
| REQUIRED: Present a 4-column comparison before recommending LMI. | ||
|
|
||
| | Scenario | When it wins | | ||
| |----------|-------------| | ||
| | Lambda on-demand | Low volume, bursty traffic | | ||
| | Lambda + Savings Plan | Moderate steady volume (~17% duration discount) | | ||
| | LMI on-demand | High volume, steady traffic | | ||
| | LMI + 3yr Savings Plan | High volume + commitment (up to 72% EC2 discount) | | ||
|
sbbhimji marked this conversation as resolved.
Outdated
|
||
|
|
||
| Rule of thumb: LMI becomes cost-competitive at 50-100M+ req/month with steady traffic. | ||
|
|
||
| See [references/cost-comparison.md](references/cost-comparison.md) for formulas, worked example, and comparison table template. | ||
|
|
||
| ### Step 3: Configure the Deployment | ||
|
|
||
| **Instance families** (400+ types, .large and up): C-series (compute), M-series (general), R-series (memory). ARM (Graviton) for best price-performance. | ||
|
|
||
| **Memory-to-vCPU ratios**: 2:1 (compute), 4:1 (general, default), 8:1 (memory). Min 2 GB, max 32 GB. | ||
|
|
||
| **Multi-concurrency defaults/vCPU**: Node.js 64, Java 32, .NET 32, Python 16. | ||
|
|
||
| **Scaling**: MinExecutionEnvironments (default 3), MaxVCpuCount (required), TargetResourceUtilization. | ||
|
|
||
| See [references/configuration-guide.md](references/configuration-guide.md) for decision trees and detailed tuning. | ||
|
|
||
| ### Step 4: Migrate the Code | ||
|
|
||
| Review code for thread safety. LMI runs multiple invocations concurrently per execution environment. | ||
|
|
||
| **Common issues**: mutable globals, shared `/tmp` paths, non-thread-safe libs, per-invocation DB connections. | ||
|
|
||
| See [references/thread-safety.md](references/thread-safety.md) for the review checklist and [references/migration-patterns.md](references/migration-patterns.md) for runtime-specific before/after code. | ||
|
|
||
| ### Step 5: Set Up Infrastructure | ||
|
|
||
| Two IAM roles required (execution + operator). VPC with 3+ AZ subnets. Create capacity provider, attach function, publish version. | ||
|
sbbhimji marked this conversation as resolved.
Outdated
|
||
|
|
||
| See [references/infrastructure-setup.md](references/infrastructure-setup.md) for CLI commands, SAM, and CDK templates. | ||
|
|
||
| ### Step 6: Validate and Cut Over | ||
|
|
||
| 1. Test locally with LocalStack (supports LMI emulation) | ||
|
sbbhimji marked this conversation as resolved.
Outdated
|
||
| 2. Monitor CloudWatch: CPU utilization, memory, concurrency, throttle rate | ||
| 3. Gradual traffic shift with weighted aliases (10% → 50% → 100%) | ||
| 4. Compare costs after 1-2 weeks of production data | ||
| 5. Decommission standard Lambda once stable | ||
|
|
||
| ## Best Practices | ||
|
|
||
| ### Configuration | ||
|
|
||
| - Do: Start with 4:1 ratio and runtime default concurrency | ||
| - Do: Use ARM (Graviton) unless x86 dependencies exist | ||
| - Do: Let Lambda choose instance types unless specific hardware needed | ||
| - Do: Set MaxVCpuCount to control cost ceiling | ||
| - Don't: Set MinExecutionEnvironments below 3 (breaks AZ resiliency) | ||
| - Don't: Over-restrict instance types (lowers availability) | ||
|
|
||
| ### Migration | ||
|
|
||
| - Do: Review all code for thread safety before attaching to capacity provider | ||
| - Do: Use weighted aliases for gradual traffic shift | ||
| - Do: Include request IDs in all log statements | ||
| - Do: Initialize DB pools and SDK clients outside the handler | ||
| - Don't: Write to hardcoded `/tmp` paths without request-unique naming | ||
| - Don't: Skip cost comparison — LMI is not always cheaper | ||
|
|
||
| ### Operations | ||
|
|
||
| - Do: Set CloudWatch alarms on throttle rate > 1% and CPU > 80% | ||
| - Do: Plan for 14-day instance rotation (automatic) | ||
| - Don't: Manually terminate LMI EC2 instances (delete the capacity provider instead) | ||
| - Don't: Forget to publish a version — unpublished functions cannot run on LMI | ||
|
|
||
| ## Limits Quick Reference | ||
|
|
||
| | Resource | Limit | | ||
| |----------|-------| | ||
| | Memory | 2 GB min, 32 GB max | | ||
| | Instances | 3 minimum (AZ resiliency) | | ||
| | Instance lifespan | 14 days (auto-replaced) | | ||
| | Concurrency/vCPU | 64 (Node.js), 32 (Java/.NET), 16 (Python) | | ||
| | Runtimes | Node.js, Java, .NET, Python | | ||
| | Instance families | C, M, R (.large and up) | | ||
| | Scaling | Absorbs 50% spike; doubles within 5 min | | ||
|
|
||
| ## Troubleshooting Quick Reference | ||
|
|
||
| | Issue | Cause | Fix | | ||
| |-------|-------|-----| | ||
| | 429 throttles | Traffic exceeds scaling speed | Increase MinExecutionEnvironments or lower TargetResourceUtilization | | ||
| | Function stuck PENDING | Provisioning instances | Wait; check VPC/IAM config | | ||
| | Architecture mismatch | Function ≠ capacity provider arch | Align both to same architecture | | ||
| | Cannot terminate instances | Managed by capacity provider | Delete capacity provider instead | | ||
| | Race conditions | Code not thread-safe | See [references/thread-safety.md](references/thread-safety.md) | | ||
|
|
||
| See [references/troubleshooting.md](references/troubleshooting.md) for detailed resolution steps. | ||
|
|
||
| ## Configuration | ||
|
|
||
| ### AWS CLI Setup | ||
|
|
||
| REQUIRED: AWS credentials configured on the host machine. | ||
|
|
||
| **Verify access**: Run `aws sts get-caller-identity` | ||
|
|
||
| ### Regional Availability | ||
|
|
||
| us-east-1, us-east-2, us-west-2, ap-northeast-1, eu-west-1 | ||
|
sbbhimji marked this conversation as resolved.
Outdated
|
||
|
|
||
| ## Language Selection | ||
|
|
||
| Default: TypeScript | ||
|
|
||
| Override: "use Python" → Python, "use JavaScript" → JavaScript. When not specified, ALWAYS use TypeScript. | ||
|
|
||
| ## IaC Framework Selection | ||
|
|
||
| Default: CDK | ||
|
|
||
| Override: "use SAM" → SAM YAML, "use CloudFormation" → CloudFormation YAML. When not specified, ALWAYS use CDK. | ||
|
|
||
| ## Error Scenarios | ||
|
|
||
| ### Serverless MCP Server Unavailable | ||
|
|
||
| - Inform user: "AWS Serverless MCP not responding" | ||
| - Ask: "Proceed without MCP support?" | ||
| - DO NOT continue without user confirmation | ||
|
|
||
| ### Unsupported Runtime | ||
|
|
||
| - State: "Lambda Managed Instances does not yet support [runtime]" | ||
| - List supported runtimes | ||
| - Suggest standard Lambda as alternative | ||
|
|
||
| ### Unsupported Region | ||
|
|
||
| - State: "Lambda Managed Instances is not yet available in [region]" | ||
| - List available regions | ||
|
|
||
| ## Resources | ||
|
|
||
| - [Lambda Managed Instances Docs](https://docs.aws.amazon.com/lambda/latest/dg/lambda-managed-instances.html) | ||
| - [Introducing LMI (AWS Blog)](https://aws.amazon.com/blogs/aws/introducing-aws-lambda-managed-instances-serverless-simplicity-with-ec2-flexibility/) | ||
| - [Build High-Performance Apps with LMI](https://aws.amazon.com/blogs/compute/build-high-performance-apps-with-aws-lambda-managed-instances/) | ||
| - [AWS Lambda Pricing](https://aws.amazon.com/lambda/pricing/) | ||
59 changes: 59 additions & 0 deletions
59
...erverless/skills/aws-lambda-managed-instances/references/configuration-guide.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,59 @@ | ||
| # LMI Configuration Guide | ||
|
|
||
| ## Instance Type Decision Tree | ||
|
|
||
| - **CPU-intensive** (encoding, ML, compression) → C-series, 2:1 ratio, concurrency=1/vCPU | ||
| - **Memory-intensive** (caching, large datasets) → R-series, 8:1 ratio | ||
| - **Network-intensive** (streaming, data transfer) → Use AllowedInstanceTypes for n-suffix types, 4:1 ratio | ||
| - **General/balanced** (web APIs, microservices) → M-series, 4:1 ratio, default concurrency | ||
|
|
||
| Architecture: ARM (Graviton, g-suffix) for price-performance. x86 (i=Intel, a=AMD) when dependencies require it. | ||
|
|
||
| ## Memory-to-vCPU Ratios | ||
|
|
||
| | Ratio | Profile | When to use | Memory examples | | ||
| |-------|---------|-------------|-----------------| | ||
| | 2:1 | Compute | CPU-bound work | 2GB/1vCPU, 4GB/2vCPU | | ||
| | 4:1 | General | Most workloads (default) | 4GB/1vCPU, 8GB/2vCPU | | ||
| | 8:1 | Memory | Caching, data, Python apps | 8GB/1vCPU, 16GB/2vCPU | | ||
|
|
||
| Min: 2 GB / 1 vCPU. Max: 32 GB. Memory must align with ratio multiples. | ||
|
|
||
| ## Memory Sizing from Existing Lambda | ||
|
|
||
| | Current Lambda | LMI memory | Ratio | Rationale | | ||
| |---------------|------------|-------|-----------| | ||
| | 128-512 MB | 2048 MB | 4:1 | LMI minimum; multi-concurrency shares memory | | ||
| | 512 MB-1 GB | 2048 MB | 4:1 | Room for concurrent requests | | ||
| | 1-2 GB | 4096 MB | 4:1 | Standard upgrade path | | ||
| | 2-4 GB | 4096-8192 MB | 4:1 or 8:1 | Depends on memory vs CPU bottleneck | | ||
| | 4-10 GB | 8192-16384 MB | 8:1 | Likely memory-heavy workload | | ||
|
|
||
| ## Concurrency Tuning | ||
|
|
||
| | Runtime | Default/vCPU | I/O-bound | CPU-bound | | ||
| |---------|-------------|-----------|-----------| | ||
| | Node.js | 64 | Keep or increase | 1 per vCPU | | ||
| | Java | 32 | Keep | 1 per vCPU | | ||
| | .NET | 32 | Keep | 1 per vCPU | | ||
| | Python | 16 | Keep | 1 per vCPU | | ||
|
|
||
| Total capacity = MinExecutionEnvironments × PerExecutionEnvironmentMaxConcurrency | ||
|
|
||
| ## Capacity Provider Scaling Controls | ||
|
|
||
| | Control | Default | Guidance | | ||
| |---------|---------|----------| | ||
| | MinExecutionEnvironments | 3 | Increase for baseline capacity; never below 3 | | ||
| | MaxExecutionEnvironments | — | Set based on cost budget | | ||
| | MaxVCpuCount | Required | Start at 30, adjust by load | | ||
| | TargetResourceUtilization | ~50% headroom | Raise for cost savings (less burst tolerance) | | ||
| | AllowedInstanceTypes | All | Restrict only for specific hardware needs | | ||
| | ExcludedInstanceTypes | None | Exclude expensive types in dev/test | | ||
|
|
||
| ## Monitoring Thresholds | ||
|
|
||
| - **CPU > 80%**: reduce concurrency or add vCPUs | ||
| - **CPU < 20%**: increase concurrency for better utilization | ||
| - **Throttle rate (429s) > 1%**: increase MinExecutionEnvironments or reduce utilization target | ||
| - **Memory > 90%**: increase memory or reduce concurrency |
72 changes: 72 additions & 0 deletions
72
...ws-serverless/skills/aws-lambda-managed-instances/references/cost-comparison.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,72 @@ | ||
| # Lambda vs LMI Cost Comparison | ||
|
|
||
| ## Pricing Components | ||
|
|
||
| **Standard Lambda:** $0.20/M requests + $0.0000166667/GB-sec (x86) or $0.0000133334 (ARM). Compute Savings Plans give ~17% discount on duration. | ||
|
|
||
| **LMI:** $0.20/M requests + EC2 instance cost (24/7) + 15% management fee on EC2 on-demand price. No per-request duration charge. Savings Plans/RIs discount up to 72% on EC2 compute. 15% fee always on on-demand price. | ||
|
|
||
| ## Discount Comparison | ||
|
|
||
| | Option | Lambda discount | LMI discount | | ||
| |--------|----------------|--------------| | ||
| | On-demand | 0% | 0% | | ||
| | Compute Savings Plan (1yr) | ~17% on duration | ~40-50% on EC2 | | ||
| | Compute Savings Plan (3yr) | ~17% on duration | ~60-72% on EC2 | | ||
| | Reserved Instances (1yr) | N/A | ~40% on EC2 | | ||
| | Reserved Instances (3yr) | N/A | ~60-65% on EC2 | | ||
|
|
||
| Compute Savings Plans apply to both Lambda duration AND EC2 instances. One commitment can cover both. | ||
|
|
||
| ## Calculation Formulas | ||
|
|
||
| ``` | ||
| # Lambda on-demand | ||
| duration_cost = requests × avg_duration_sec × memory_GB × $0.0000166667 | ||
| request_cost = requests × $0.20 / 1,000,000 | ||
| total = duration_cost + request_cost | ||
|
|
||
| # Lambda + Savings Plan (17% on duration) | ||
| total = (duration_cost × 0.83) + request_cost | ||
|
|
||
| # LMI on-demand | ||
| ec2_cost = num_instances × hourly_price × 730 | ||
| mgmt_fee = ec2_cost × 0.15 | ||
| total = ec2_cost + mgmt_fee + request_cost | ||
|
|
||
| # LMI + 3yr Savings Plan (65% discount on EC2) | ||
| total = (ec2_cost × 0.35) + mgmt_fee + request_cost | ||
| ``` | ||
|
|
||
| ## Comparison Table Template | ||
|
|
||
| Present this for every assessment: | ||
|
|
||
| ``` | ||
| | Component | Lambda OD | Lambda+SP | LMI OD | LMI+3yr SP | | ||
| |--------------------|-----------|-----------|--------|------------| | ||
| | Requests | $X | $X | $X | $X | | ||
| | Duration/compute | $X | $X | $X | $X | | ||
| | Management fee | — | — | $X | $X | | ||
| | Monthly total | $X | $X | $X | $X | | ||
| | Annual total | $X | $X | $X | $X | | ||
| | Savings vs Lambda | baseline | X% | X% | X% | | ||
|
sbbhimji marked this conversation as resolved.
Outdated
|
||
| ``` | ||
|
|
||
| ## Worked Example | ||
|
|
||
| Node.js API, 100 req/s steady (259M req/mo), 200ms avg, 512 MB, x86: | ||
|
|
||
| | Scenario | Monthly | Annual | Savings | | ||
| |----------|---------|--------|---------| | ||
| | Lambda on-demand | $484 | $5,808 | baseline | | ||
|
sbbhimji marked this conversation as resolved.
Outdated
|
||
| | Lambda + 3yr SP | $411 | $4,932 | 15% | | ||
| | LMI on-demand (3× m7i.large) | $288 | $3,456 | 40% | | ||
| | LMI + 3yr SP | $155 | $1,860 | 68% | | ||
|
|
||
| ## When LMI is NOT Cheaper | ||
|
|
||
| - < 50M req/month (fixed 3-instance cost exceeds Lambda) | ||
| - Very short functions (< 100ms duration) | ||
| - Highly bursty, unpredictable traffic | ||
| - Workloads needing scale-to-zero | ||
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.