From b17a57b3dd5ba6783fbc6d09bf47dc1934de5085 Mon Sep 17 00:00:00 2001 From: Brian Rinaldi Date: Fri, 24 Apr 2026 14:06:47 -0400 Subject: [PATCH 01/58] Initial draft for revising getting started The concepts behind this draft: 1. Design paths for the main LocalStack use cases 2. Simplify the quickstart to get them to success faster 3. Have both an awslocal and a terraform quickstart 4. Bring AI and agent use cases up front [DOC-12](https://linear.app/localstack/issue/DOC-12/docs-quickstart-v2) --- .../docs/aws/getting-started/ai-workflows.mdx | 73 +++ .../docs/aws/getting-started/auth-token.mdx | 2 +- .../docs/aws/getting-started/ci-cd.mdx | 185 +++++++ src/content/docs/aws/getting-started/faq.mdx | 2 +- .../docs/aws/getting-started/help-support.md | 2 +- src/content/docs/aws/getting-started/index.md | 23 - .../docs/aws/getting-started/index.mdx | 48 ++ .../docs/aws/getting-started/installation.mdx | 85 ++- .../docs/aws/getting-started/quickstart.mdx | 501 ++++++++---------- 9 files changed, 588 insertions(+), 333 deletions(-) create mode 100644 src/content/docs/aws/getting-started/ai-workflows.mdx create mode 100644 src/content/docs/aws/getting-started/ci-cd.mdx delete mode 100644 src/content/docs/aws/getting-started/index.md create mode 100644 src/content/docs/aws/getting-started/index.mdx diff --git a/src/content/docs/aws/getting-started/ai-workflows.mdx b/src/content/docs/aws/getting-started/ai-workflows.mdx new file mode 100644 index 000000000..4746e4ff5 --- /dev/null +++ b/src/content/docs/aws/getting-started/ai-workflows.mdx @@ -0,0 +1,73 @@ +--- +title: AI & Agent Workflows +description: Use LocalStack with AI coding assistants, MCP servers, and agent-driven infrastructure automation. +template: doc +sidebar: + order: 6 +--- + +## Overview + +LocalStack is a natural fit for AI-assisted development workflows. +Whether you're using an AI coding assistant to generate infrastructure code, running an agent that deploys AWS resources, or validating AI-generated Terraform before applying it to real AWS — LocalStack gives you a safe, fast, cost-free environment to do it in. + +## Connect an AI coding assistant via MCP + +The [LocalStack MCP Server](https://github.com/localstack/localstack-mcp-server) exposes LocalStack's API as an MCP (Model Context Protocol) tool server. +This lets AI assistants like Claude, Cursor, Windsurf, or any MCP-compatible tool inspect and interact with your running LocalStack instance directly. + +With the MCP server connected, your AI assistant can: + +- List running AWS services and deployed resources +- Create, update, and delete resources in your local environment +- Query resource state to understand what's already deployed +- Help you debug issues by inspecting live infrastructure + +**Quick setup:** + +```bash +# Install the LocalStack MCP server +pip install localstack-mcp-server +``` + +Then add it to your AI tool's MCP configuration. +See the [localstack-mcp-server README](https://github.com/localstack/localstack-mcp-server) for tool-specific setup instructions for Claude, Cursor, and others. + +:::note +The MCP server connects to a running LocalStack instance — make sure LocalStack is started first with `lstk start` or `localstack start`. +::: + +## Deploy with agent-driven automation using Skills + +[LocalStack Skills](https://github.com/localstack/skills) are pre-built agent skill definitions for deploying common AWS architectures locally. +Instead of stepping through manual CLI commands, you describe what you want and an agent handles the deployment. + +Skills are useful when: + +- You want to scaffold a new local environment quickly without writing all the infrastructure code yourself +- You're using an agent-first workflow and want LocalStack to be a first-class deployment target +- You want to iterate rapidly on architecture without touching real AWS + +Browse the [skills repository](https://github.com/localstack/skills) for available skills and setup instructions. + +## Validate AI-generated IaC before applying to AWS + +A common pattern when using AI to generate Terraform, CDK, or CloudFormation is to deploy it to LocalStack first. +This catches configuration errors, missing permissions, and service interaction bugs before you spend time (and money) deploying to real AWS. + +The workflow is: + +1. Generate infrastructure code with your AI tool +2. Deploy to LocalStack with `tflocal apply` (Terraform), `cdklocal deploy` (CDK), or the AWS CLI +3. Run your integration tests against the local environment +4. When everything passes, deploy to real AWS with confidence + +See [Tooling](/aws/tooling/) for the full list of LocalStack-aware wrappers for common IaC tools. + +## Summary + +| Use case | Tool | +|---|---| +| AI assistant that can inspect & manage local resources | [LocalStack MCP Server](https://github.com/localstack/localstack-mcp-server) | +| Agent-driven infrastructure deployment | [LocalStack Skills](https://github.com/localstack/skills) | +| Validate AI-generated IaC safely | LocalStack + `tflocal` / `cdklocal` / `awslocal` | diff --git a/src/content/docs/aws/getting-started/auth-token.mdx b/src/content/docs/aws/getting-started/auth-token.mdx index b71c45a14..4f6446c00 100644 --- a/src/content/docs/aws/getting-started/auth-token.mdx +++ b/src/content/docs/aws/getting-started/auth-token.mdx @@ -3,7 +3,7 @@ title: Auth Token description: Configure your Auth Token to access and activate LocalStack. template: doc sidebar: - order: 3 + order: 4 --- import { Code, Tabs, TabItem } from '@astrojs/starlight/components'; diff --git a/src/content/docs/aws/getting-started/ci-cd.mdx b/src/content/docs/aws/getting-started/ci-cd.mdx new file mode 100644 index 000000000..feac59510 --- /dev/null +++ b/src/content/docs/aws/getting-started/ci-cd.mdx @@ -0,0 +1,185 @@ +--- +title: CI/CD Setup +description: Run LocalStack in CI pipelines — auth tokens, Docker Compose, and GitHub Actions examples. +template: doc +sidebar: + order: 5 +--- + +import { Tabs, TabItem } from '@astrojs/starlight/components'; + +## Overview + +LocalStack works great in CI environments. +The setup differs from local development in a few important ways: + +- **Use a CI Auth Token**, not your personal Developer token +- **Manage the container directly** via Docker Compose or `docker run` — `lstk` and the LocalStack Desktop are local-only tools +- **LocalStack is ephemeral by default** — each CI run starts fresh, which is usually exactly what you want for reproducible tests + +## Step 1 — Get a CI Auth Token + +CI pipelines should use a dedicated CI Auth Token, not a Developer token tied to a specific user. + +1. Go to the [Auth Tokens page](https://app.localstack.cloud/workspace/auth-tokens) in the LocalStack Web Application +2. Create a new **CI Auth Token** +3. Add it as a secret in your CI provider (e.g., `LOCALSTACK_AUTH_TOKEN`) + +:::danger[Keep your token secret] +Never commit an auth token to source control. +Always inject it via your CI provider's secrets or environment variable mechanism. +If a token is compromised, rotate it immediately on the Auth Tokens page — old tokens are invalidated instantly. +::: + +See the [Auth Token documentation](/aws/getting-started/auth-token/) for full details on token types and configuration. + +## Step 2 — Start LocalStack in CI + + + + The recommended approach is to start LocalStack as a service container or as a step using the official GitHub Action: + + ```yaml + # .github/workflows/integration-tests.yml + name: Integration Tests + + on: [push, pull_request] + + jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Start LocalStack + uses: LocalStack/setup-localstack@v0.2 + with: + image-tag: latest + env: + LOCALSTACK_AUTH_TOKEN: ${{ secrets.LOCALSTACK_AUTH_TOKEN }} + + - name: Run tests + run: | + # Your test commands here, e.g.: + pip install awscli-local + awslocal s3 mb s3://my-test-bucket + pytest tests/integration/ + ``` + + The `setup-localstack` action handles pulling the image, starting the container, and waiting for LocalStack to be ready. + + + Add LocalStack as a service in your `docker-compose.yml`: + + ```yaml + services: + localstack: + container_name: localstack-main + image: localstack/localstack-pro + ports: + - "127.0.0.1:4566:4566" + - "127.0.0.1:4510-4559:4510-4559" + - "127.0.0.1:443:443" + environment: + - LOCALSTACK_AUTH_TOKEN=${LOCALSTACK_AUTH_TOKEN:?} + - DEBUG=${DEBUG:-0} + volumes: + - "${LOCALSTACK_VOLUME_DIR:-./volume}:/var/lib/localstack" + - "/var/run/docker.sock:/var/run/docker.sock" + ``` + + Start it and wait for readiness: + + ```bash + docker compose up -d localstack + # Wait for LocalStack to be ready + until curl -s http://localhost:4566/_localstack/health | grep -q '"running"'; do sleep 1; done + ``` + + :::note + Mounting `/var/run/docker.sock` is required for Lambda emulation, which uses Docker to run function containers. + ::: + + + Start LocalStack directly with `docker run`: + + ```bash + docker run \ + --rm -d \ + --name localstack-main \ + -p 127.0.0.1:4566:4566 \ + -p 127.0.0.1:4510-4559:4510-4559 \ + -e LOCALSTACK_AUTH_TOKEN=${LOCALSTACK_AUTH_TOKEN:?} \ + -v /var/run/docker.sock:/var/run/docker.sock \ + localstack/localstack-pro + + # Wait for readiness + until curl -s http://localhost:4566/_localstack/health | grep -q '"running"'; do sleep 1; done + ``` + + + Add LocalStack as a service in your CircleCI config: + + ```yaml + version: 2.1 + + jobs: + integration-tests: + docker: + - image: cimg/python:3.12 + - image: localstack/localstack-pro + environment: + LOCALSTACK_AUTH_TOKEN: $LOCALSTACK_AUTH_TOKEN + steps: + - checkout + - run: + name: Wait for LocalStack + command: | + until curl -s http://localhost:4566/_localstack/health | grep -q '"running"'; do sleep 1; done + - run: + name: Run tests + command: pytest tests/integration/ + ``` + + Set `LOCALSTACK_AUTH_TOKEN` in your CircleCI project's environment variables. + + + +## Verify activation + +After LocalStack starts, confirm the license is active: + +```bash +curl -s http://localhost:4566/_localstack/info | jq '.is_license_activated' +# Should return: true +``` + +## Key differences from local development + +| | Local development | CI/CD | +|---|---|---| +| **CLI** | `lstk` or LocalStack CLI | Docker Compose / `docker run` | +| **Auth** | Browser login or stored token | `LOCALSTACK_AUTH_TOKEN` env var | +| **Token type** | Developer token | CI token | +| **State** | Optional persistence | Ephemeral (fresh per run) | +| **Startup** | Interactive TUI | `--non-interactive` / `-d` flag | + +## Persisting state across runs + +By default, LocalStack starts fresh on every run — all resources are gone when the container stops. +This is ideal for most CI use cases (clean, reproducible tests). + +If you need to share state across runs (e.g., seed data, pre-built infrastructure), look at [Cloud Pods](/aws/capabilities/state-management/cloud-pods/), which let you snapshot and restore LocalStack state. + +## More CI integrations + +LocalStack has dedicated integration guides for many CI providers: + +- [GitHub Actions](/aws/integrations/continuous-integration/github-actions/) +- [GitLab CI](/aws/integrations/continuous-integration/gitlab-ci/) +- [CircleCI](/aws/integrations/continuous-integration/circleci/) +- [AWS CodeBuild](/aws/integrations/continuous-integration/codebuild/) +- [Travis CI](/aws/integrations/continuous-integration/travis-ci/) +- [Bitbucket Pipelines](/aws/integrations/continuous-integration/bitbucket/) + +See the full [CI/CD integrations](/aws/integrations/continuous-integration/) section for details. diff --git a/src/content/docs/aws/getting-started/faq.mdx b/src/content/docs/aws/getting-started/faq.mdx index 12128b64a..3eded1dfc 100644 --- a/src/content/docs/aws/getting-started/faq.mdx +++ b/src/content/docs/aws/getting-started/faq.mdx @@ -3,7 +3,7 @@ title: FAQ description: Frequently asked questions about LocalStack for AWS. template: doc sidebar: - order: 5 + order: 7 --- import { Tabs, TabItem } from '@astrojs/starlight/components'; diff --git a/src/content/docs/aws/getting-started/help-support.md b/src/content/docs/aws/getting-started/help-support.md index c66410033..d2dde0db0 100644 --- a/src/content/docs/aws/getting-started/help-support.md +++ b/src/content/docs/aws/getting-started/help-support.md @@ -3,7 +3,7 @@ title: Help & Support description: Get help and support with LocalStack. template: doc sidebar: - order: 6 + order: 8 --- ## Introduction diff --git a/src/content/docs/aws/getting-started/index.md b/src/content/docs/aws/getting-started/index.md deleted file mode 100644 index 017debdb2..000000000 --- a/src/content/docs/aws/getting-started/index.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: Overview -description: This section describes how to get started with LocalStack using a variety of options, and provides details on how LocalStack can be configured to fit the needs of a local cloud sandbox for development, testing, and experimentation. -template: doc -editUrl: false -sidebar: - order: 1 ---- - -[LocalStack](https://localstack.cloud) is a cloud service emulator that runs in a single container on your laptop or in your CI environment. -With LocalStack, you can run your AWS applications or Lambdas entirely on your local machine without connecting to a remote cloud provider! - -Whether you are testing complex CDK applications or Terraform configurations, or just beginning to learn about AWS services, LocalStack helps speed up and simplify your testing and development workflow. - -LocalStack supports a growing number of [AWS services](/aws/services/) -, like [Lambda](/aws/services/lambda), [S3](/aws/services/s3), [DynamoDB](/aws/services/dynamodb), [Kinesis](/aws/services/kinesis), [SQS](/aws/services/sqs), [SNS](/aws/services/sns), and more! -[LocalStack for AWS](https://localstack.cloud/pricing) also supports APIs and advanced features to make your cloud development experience a breeze. - -You can find a comprehensive list of supported APIs on each AWS service page. - -LocalStack also provides additional features to make your life as a cloud developer easier! - -Check out LocalStack's [Cloud Developer Tools](/aws/tooling/). diff --git a/src/content/docs/aws/getting-started/index.mdx b/src/content/docs/aws/getting-started/index.mdx new file mode 100644 index 000000000..4b0e25035 --- /dev/null +++ b/src/content/docs/aws/getting-started/index.mdx @@ -0,0 +1,48 @@ +--- +title: Overview +description: This section describes how to get started with LocalStack for AWS using a variety of options, and provides details on how LocalStack can be configured to fit the needs of a local cloud sandbox for development, testing, and experimentation. +template: doc +editUrl: false +sidebar: + order: 1 +--- + +import { SectionCards } from '../../../../components/SectionCards.tsx'; + +[LocalStack for AWS](https://localstack.cloud) is a cloud service emulator that runs in a single container on your laptop or in your CI environment. +It gives you a fully functional AWS environment — Lambda, DynamoDB, S3, SQS, and [80+ more services](/aws/services/) — without touching a real AWS account and without incurring cloud costs. + +Here's why developers and teams use it: + +- **Faster development loops** — Test changes against local AWS services instantly, without waiting on real deployments or worrying about cloud costs. +- **Integration testing in CI** — Run real integration tests against local AWS infrastructure in every pull request, catching bugs before they reach production. +- **Validate IaC before applying** — Deploy your Terraform, CDK, or CloudFormation to LocalStack first. Confirm it works the way you expect before applying to a real AWS environment. +- **Safe experimentation** — Explore new AWS services and architectures freely, with no risk to production systems. + +LocalStack for AWS also includes advanced capabilities for teams: [Cloud Pods](/aws/capabilities/state-management/cloud-pods/) for sharing and restoring state, [IAM policy enforcement](/aws/capabilities/security-testing/iam-policy-enforcement/), [Chaos Engineering](/aws/capabilities/chaos-engineering/), and more. + +## Choose your path + + diff --git a/src/content/docs/aws/getting-started/installation.mdx b/src/content/docs/aws/getting-started/installation.mdx index 4e76ecba2..dcc080ab8 100644 --- a/src/content/docs/aws/getting-started/installation.mdx +++ b/src/content/docs/aws/getting-started/installation.mdx @@ -1,24 +1,68 @@ --- title: Installation -description: Basic installation guide to get started with LocalStack on your local machine. +description: All installation methods for LocalStack — lstk, LocalStack CLI, Docker Compose, Docker, and Helm. template: doc sidebar: - order: 2 + order: 3 --- import { Code, LinkButton, Tabs, TabItem } from '@astrojs/starlight/components'; import { LOCALSTACK_VERSION } from "astro:env/server"; -## LocalStack CLI +## Local development -The quickest way get started with LocalStack is by using the LocalStack CLI. -It allows you to start LocalStack from your command line. +There are two CLI options for running LocalStack on your laptop. Start with `lstk` if you want the fastest path to a running instance, or use the LocalStack CLI if you need full feature support. + +### lstk + +`lstk` is a lightweight, Go-based CLI that handles the full startup sequence in one command: browser-based login, image pull, and container launch. +It's the fastest way to get LocalStack running locally. + +:::caution[Early release] +`lstk` currently supports core lifecycle commands (`start`, `stop`, `logs`, `status`). +For advanced features like Cloud Pods, Extensions, and Ephemeral Instances, use the [LocalStack CLI](#localstack-cli) instead. +Both tools can coexist on the same system. +::: + +Install `lstk`: + + + + ```bash + brew install localstack/tap/lstk + ``` + + + ```bash + npm install -g @localstack/lstk + ``` + + + Download a pre-built binary for your platform from [GitHub Releases](https://github.com/localstack/lstk/releases) and add it to your `PATH`. + + + +Start LocalStack: + +```bash +lstk start +``` + +On first run, `lstk` opens a browser login flow. +After authenticating, it pulls the LocalStack image and starts the container. +Subsequent starts use the stored credential from your system keyring — no manual token management needed. + +--- + +### LocalStack CLI + +The full-featured LocalStack CLI gives you access to all LocalStack capabilities. Please make sure that you have a working [Docker installation](https://docs.docker.com/get-docker/) on your machine before moving on. ### Installing LocalStack CLI The CLI starts and manages the LocalStack Docker container. -For alternative methods of managing the LocalStack container, see our [alternative installation instructions](#alternatives). +For alternative methods of managing the LocalStack container, see our [alternative installation instructions](#ci-and-server-environments). @@ -196,30 +240,25 @@ Updating the LocalStack CLI using `localstack update localstack-cli` and `locals If it was installed using the pre-built binary or via Brew, please run the installation steps again to update to the latest version. ::: -## Alternatives - -Besides using the CLI, there are other ways of starting and managing your LocalStack instance: - -- [LocalStack Desktop](#localstack-desktop)\ - Get a desktop experience and work with your local LocalStack instance via the UI. +## CI and server environments -- [LocalStack Docker Extension](#localstack-docker-extension)\ - Use the LocalStack extension for Docker Desktop to work with your LocalStack instance. +For CI pipelines and server deployments, you'll manage the LocalStack container directly rather than using a local CLI. +See the [CI/CD Setup guide](/aws/getting-started/ci-cd/) for a complete walkthrough including GitHub Actions examples. -- [Docker-Compose](#docker-compose)\ - Use Docker Compose to configure and start your LocalStack Docker container. +The options below cover the main container management approaches: -- [Docker](#docker)\ - Use the Docker CLI to manually start the LocalStack Docker container. +- [Docker Compose](#docker-compose) — recommended for CI and team environments +- [Docker](#docker) — direct container control for scripted setups +- [Helm](#helm) — deploy LocalStack in a Kubernetes cluster -- [Helm](#helm)\ - Use Helm to create a LocalStack deployment in a Kubernetes cluster. +The LocalStack emulator is available on Docker Hub as `localstack/localstack-pro`. -LocalStack runs inside a Docker container, and the above options are different ways to start and manage the LocalStack Docker container. +For a comprehensive overview of LocalStack images, see the [Docker images documentation](/aws/capabilities/config/docker-images). -The LocalStack emulator is available on Docker Hub (`localstack/localstack-pro`). +## GUI tools -For a comprehensive overview of the LocalStack images, check out our [Docker images documentation](/aws/capabilities/config/docker-images). +- [LocalStack Desktop](#localstack-desktop) — desktop UI for managing your local instance +- [LocalStack Docker Extension](#localstack-docker-extension) — manage LocalStack from Docker Desktop ### LocalStack Desktop diff --git a/src/content/docs/aws/getting-started/quickstart.mdx b/src/content/docs/aws/getting-started/quickstart.mdx index 7774291f2..f44442699 100644 --- a/src/content/docs/aws/getting-started/quickstart.mdx +++ b/src/content/docs/aws/getting-started/quickstart.mdx @@ -1,361 +1,294 @@ --- title: Quickstart -description: How to run an AWS application on your local machine and test local cloud development with LocalStack. +description: Deploy a serverless API locally with LocalStack in under 10 minutes using Lambda and DynamoDB. template: doc sidebar: - order: 4 + order: 2 --- -import { Code, LinkButton, Tabs, TabItem } from '@astrojs/starlight/components'; +import { Tabs, TabItem } from '@astrojs/starlight/components'; ## Introduction -In this quickstart guide, we'll walk you through the process of starting LocalStack on your local machine and deploying a [serverless image resizer application](https://github.com/localstack-samples/sample-serverless-image-resizer-s3-lambda) that utilizes several AWS services. -This guide aims to help you understand how to use LocalStack for the development and testing of your AWS applications locally. -It introduces you to the following key concepts: +In this quickstart you'll start LocalStack and deploy a simple serverless API — a **Lambda function backed by DynamoDB** — entirely on your local machine. +No AWS account needed. -- Starting a LocalStack instance on your local machine. -- Deploying an AWS serverless application infrastructure locally. -- Running an automated integration test suite against local infrastructure. -- Exploring the LocalStack Web Application to view deployed resources. -- Destroying the local infrastructure you have provisioned. +By the end you will have: -## Architecture +- LocalStack running locally in Docker +- A Lambda function deployed and invokable via a public URL +- A DynamoDB table storing data written by the Lambda +- Confirmed that your local environment behaves like real AWS -The following diagram shows the architecture that we will deploy locally using LocalStack: - -![An AWS architecture demonstrating a sample serverless image resizer application](https://user-images.githubusercontent.com/3996682/229322761-92f52eec-5bfb-412a-a3cb-8af4ee1fed24.png) - -The architecture: - -- Configures S3 bucket notifications to invoke a Lambda function. -- Provides S3 pre-signed POST URLs for direct uploads to the S3 bucket. -- Creates S3 website hosting for serving the static application client. -- Configures direct invocation URLs for Lambda functions accessible to the client. -- Establishes Lambda SNS to SNS topic notifications for failure handling. -- Creates SNS to SES subscriptions for email notifications triggered by specific events. - -An internal SES LocalStack testing endpoint (`/_localstack/aws/ses`) is configured as well, to test email sending functionality while running our local integration test suite. +Choose your preferred deployment style below: **AWS CLI** (`awslocal`) or **Terraform** (`tflocal`). ## Prerequisites -- [LocalStack CLI](/aws/getting-started/installation/#installing-localstack-cli) -- [LocalStack Web Application account](https://app.localstack.cloud/sign-up) & [Auth Token](/aws/getting-started/auth-token/) -- [Docker](https://docs.docker.com/get-docker/) -- [Python 3.11+](https://www.python.org/downloads/) & `pip` -- [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) & [`awslocal` wrapper](/aws/integrations/aws-native-tools/aws-cli/#localstack-aws-cli-awslocal) -- `jq`, `zip` & `curl` - -You can start LocalStack using the `localstack` CLI. -Start the LocalStack for AWS container with your `LOCALSTACK_AUTH_TOKEN` pre-configured: +- [Docker](https://docs.docker.com/get-docker/) installed and running +- A [LocalStack account](https://app.localstack.cloud/sign-up) (free tier works) - - - \nlocalstack start`} lang="shell" /> - - - \nlocalstack start`} lang="shell" /> - - +## Step 1 — Install and start LocalStack -If you prefer running LocalStack in detached mode, you can add the `-d` flag to the `localstack start` command, and use Docker Desktop to view the logs. +The fastest way to get LocalStack running locally is with `lstk`, a lightweight CLI that handles authentication and image setup automatically. -## Instructions + + + Install `lstk`: -To get started, clone the sample application repository from GitHub: + ```bash + brew install localstack/tap/lstk # macOS / Linux with Homebrew + ``` -```bash -git clone https://github.com/localstack-samples/sample-serverless-image-resizer-s3-lambda.git -cd sample-serverless-image-resizer-s3-lambda -``` + ```bash + npm install -g @localstack/lstk # or via npm + ``` -You can now follow the instructions below to start LocalStack, deploy the sample application, and test the application. + Then start LocalStack: -### Setup a virtual environment + ```bash + lstk start + ``` -To deploy the sample application, you need to have specific Python packages are installed. -It is advisable to utilize a virtual environment for the installation process, allowing the packages to be installed in an isolated environment. -Execute the following commands to create a virtual environment and install the packages in `requirements-dev.txt`: + On first run, `lstk` opens a browser login to authenticate, then pulls the image and starts the container automatically. - - - ```shell - python -m venv .venv - source .venv/bin/activate - pip install -r requirements-dev.txt - ``` + :::note[Early release] + `lstk` currently supports core lifecycle commands (start, stop, logs, status). + For advanced features like Cloud Pods, Extensions, and Ephemeral Instances, use the [LocalStack CLI](/aws/getting-started/installation/#localstack-cli) instead. + ::: - - ```shell - python -m venv .venv - .venv\Scripts\activate - pip install -r requirements-dev.txt + + If you prefer the full-featured LocalStack CLI, [install it first](/aws/getting-started/installation/#localstack-cli), then [configure your auth token](/aws/getting-started/auth-token/), and start LocalStack: + + ```bash + localstack start ``` -:::tip -If you are encountering issues with the installation of the packages, such as Pillow, ensure you use the same version as the Python Lambdas (3.11.6) for Pillow to work. -If you're using pyenv, install and activate Python 3.11 with the following commands: +Wait for the container to report ready — you'll see a log line like `Ready.` or you can verify with: + ```bash -pyenv install 3.11 -pyenv global 3.11 +curl -s http://localhost:4566/_localstack/health | grep '"running"' ``` -::: -### Setup the serverless image resizer +## Step 2 — Deploy the serverless API -This application enables serverless image resizing using [S3](/aws/services/s3/), [SSM](/aws/services/ssm/), [Lambda](/aws/services/lambda/), [SNS](/aws/services/sns/), and [SES](/aws/services/ses/). -A simple web interface allows users to upload and view resized images. -A Lambda function generates S3 pre-signed URLs for direct uploads, while S3 bucket notifications trigger image resizing. -Another Lambda function lists and provides pre-signed URLs for browser display. -The application also handles Lambda failures through SNS and SES email notifications. +Now deploy a Lambda function and a DynamoDB table. Pick the tooling you prefer: -The sample application uses AWS CLI and our `awslocal` wrapper to deploy the application to LocalStack. -Before going further, you need to build your Lambda functions. -You can use the following script that will cover all three of them: + + + Install the `awslocal` wrapper if you haven't already: -```bash -deployment/build-lambdas.sh -``` + ```bash + pip install awscli-local + ``` -You can now deploy the sample application on LocalStack by running the following command: + **Create the Lambda function:** + + ```bash + mkdir -p /tmp/localstack-demo + cat > /tmp/localstack-demo/handler.py << 'EOF' + import json, boto3, os, uuid + + def handler(event, context): + table = boto3.resource('dynamodb').Table(os.environ['TABLE_NAME']) + method = event.get('requestContext', {}).get('http', {}).get('method', 'GET') + if method == 'POST': + item = {'id': str(uuid.uuid4()), **json.loads(event.get('body', '{}'))} + table.put_item(Item=item) + return {'statusCode': 200, 'body': json.dumps(item)} + result = table.scan() + return {'statusCode': 200, 'body': json.dumps(result['Items'])} + EOF + cd /tmp/localstack-demo && zip handler.zip handler.py + ``` -```bash -deployment/awslocal/deploy.sh -``` + **Create the DynamoDB table:** -Alternatively, you can follow these instructions to deploy the sample application manually step-by-step. + ```bash + awslocal dynamodb create-table \ + --table-name Messages \ + --attribute-definitions AttributeName=id,AttributeType=S \ + --key-schema AttributeName=id,KeyType=HASH \ + --billing-mode PAY_PER_REQUEST + ``` -:::tip -In absence of the `awslocal` wrapper, you can use the `aws` CLI directly, by configuring an [endpoint URL](/aws/integrations/aws-native-tools/aws-cli/#configuring-an-endpoint-url) or a [custom profile](/aws/integrations/aws-native-tools/aws-cli/#configuring-a-custom-profile) like `localstack`. -You can then swap `awslocal` with `aws --endpoint-url=http://localhost:4566` or `aws --profile=localstack` in the commands below. -::: + **Deploy the Lambda:** -#### Create the S3 buckets + ```bash + awslocal lambda create-function \ + --function-name messages-api \ + --runtime python3.12 \ + --handler handler.handler \ + --zip-file fileb:///tmp/localstack-demo/handler.zip \ + --role arn:aws:iam::000000000000:role/lambda-role \ + --environment Variables={TABLE_NAME=Messages} -```bash -awslocal s3 mb s3://localstack-thumbnails-app-images -awslocal s3 mb s3://localstack-thumbnails-app-resized -``` + awslocal lambda wait function-active --function-name messages-api + ``` -#### Add bucket names into the parameter store + **Create a public function URL:** -```bash -awslocal ssm put-parameter \ - --name /localstack-thumbnail-app/buckets/images \ - --type "String" \ - --value "localstack-thumbnails-app-images" -awslocal ssm put-parameter \ - --name /localstack-thumbnail-app/buckets/resized \ - --type "String" \ - --value "localstack-thumbnails-app-resized" -``` + ```bash + awslocal lambda create-function-url-config \ + --function-name messages-api \ + --auth-type NONE + ``` -#### Create SNS DLQ Topic for failed lambda invocations + **Retrieve the URL:** -```bash -awslocal sns create-topic --name failed-resize-topic -``` + ```bash + LAMBDA_URL=$(awslocal lambda list-function-url-configs \ + --function-name messages-api \ + --query 'FunctionUrlConfigs[0].FunctionUrl' \ + --output text) + echo $LAMBDA_URL + ``` + + + Install Terraform and the `tflocal` wrapper: -To receive immediate alerts in case of image resize failures, subscribe an email address to the system. -You can use the following command to subscribe an email address to the SNS topic: + ```bash + brew install hashicorp/tap/terraform # or see https://developer.hashicorp.com/terraform/install + pip install terraform-local + ``` -```bash -awslocal sns subscribe \ - --topic-arn arn:aws:sns:us-east-1:000000000000:failed-resize-topic \ - --protocol email \ - --notification-endpoint my-email@example.com -``` + Create a project directory and `main.tf`: -#### Create the Presign Lambda - -```bash showshowLineNumbers -(cd lambdas/presign; rm -f lambda.zip; zip lambda.zip handler.py) -awslocal lambda create-function \ - --function-name presign \ - --runtime python3.11 \ - --timeout 10 \ - --zip-file fileb://lambdas/presign/lambda.zip \ - --handler handler.handler \ - --role arn:aws:iam::000000000000:role/lambda-role \ - --environment Variables="{STAGE=local}" -awslocal lambda wait function-active-v2 --function-name presign -awslocal lambda create-function-url-config \ - --function-name presign \ - --auth-type NONE -``` + ```bash + mkdir -p /tmp/localstack-demo && cd /tmp/localstack-demo + ``` -#### Create the Image List Lambda - -```bash showshowLineNumbers -(cd lambdas/list; rm -f lambda.zip; zip lambda.zip handler.py) -awslocal lambda create-function \ - --function-name list \ - --handler handler.handler \ - --zip-file fileb://lambdas/list/lambda.zip \ - --runtime python3.11 \ - --timeout 10 \ - --role arn:aws:iam::000000000000:role/lambda-role \ - --environment Variables="{STAGE=local}" -awslocal lambda wait function-active-v2 --function-name list -awslocal lambda create-function-url-config \ - --function-name list \ - --auth-type NONE -``` + ```hcl + # main.tf + terraform { + required_providers { + aws = { source = "hashicorp/aws" } + archive = { source = "hashicorp/archive" } + } + } + + resource "aws_dynamodb_table" "messages" { + name = "Messages" + billing_mode = "PAY_PER_REQUEST" + hash_key = "id" + attribute { + name = "id" + type = "S" + } + } + + data "archive_file" "lambda" { + type = "zip" + output_path = "${path.module}/handler.zip" + source { + filename = "handler.py" + content = <<-EOF + import json, boto3, os, uuid + def handler(event, context): + table = boto3.resource('dynamodb').Table(os.environ['TABLE_NAME']) + method = event.get('requestContext', {}).get('http', {}).get('method', 'GET') + if method == 'POST': + item = {'id': str(uuid.uuid4()), **json.loads(event.get('body', '{}'))} + table.put_item(Item=item) + return {'statusCode': 200, 'body': json.dumps(item)} + result = table.scan() + return {'statusCode': 200, 'body': json.dumps(result['Items'])} + EOF + } + } + + resource "aws_iam_role" "lambda_role" { + name = "lambda-role" + assume_role_policy = jsonencode({ + Version = "2012-10-17" + Statement = [{ Action = "sts:AssumeRole", Effect = "Allow", + Principal = { Service = "lambda.amazonaws.com" } }] + }) + } + + resource "aws_lambda_function" "messages_api" { + function_name = "messages-api" + runtime = "python3.12" + handler = "handler.handler" + filename = data.archive_file.lambda.output_path + source_code_hash = data.archive_file.lambda.output_base64sha256 + role = aws_iam_role.lambda_role.arn + environment { + variables = { TABLE_NAME = aws_dynamodb_table.messages.name } + } + } + + resource "aws_lambda_function_url" "messages_api" { + function_name = aws_lambda_function.messages_api.function_name + authorization_type = "NONE" + } + + output "function_url" { + value = aws_lambda_function_url.messages_api.function_url + } + ``` -#### Build the Image Resizer Lambda + **Deploy:** - - - ```bash showshowLineNumbers - cd lambdas/resize - rm -rf libs lambda.zip - docker run --platform linux/x86_64 -v "$PWD":/var/task "public.ecr.aws/sam/build-python3.11" /bin/sh -c "pip install -r requirements.txt -t libs; exit" - cd libs && zip -r ../lambda.zip . && cd .. - zip lambda.zip handler.py - rm -rf libs - cd ../.. + ```bash + tflocal init + tflocal apply -auto-approve ``` - - - ```bash showshowLineNumbers - cd lambdas/resize - rm -rf package lambda.zip - mkdir package - pip install -r requirements.txt -t package --platform manylinux_2_28_x86_64 --python-version 3.11 --no-deps - zip lambda.zip handler.py - cd package - zip -r ../lambda.zip *; - cd ../.. - ``` - - - ```bash showshowLineNumbers - cd lambdas/resize - rm -rf package lambda.zip - mkdir package - pip install -r requirements.txt -t package - zip lambda.zip handler.py - cd package - zip -r ../lambda.zip\_; - cd ../.. + + **Retrieve the URL:** + + ```bash + LAMBDA_URL=$(tflocal output -raw function_url) + echo $LAMBDA_URL ``` -#### Create the Image Resizer Lambda - -```bash showshowLineNumbers -awslocal lambda create-function \ - --function-name resize \ - --runtime python3.11 \ - --timeout 10 \ - --zip-file fileb://lambdas/resize/lambda.zip \ - --handler handler.handler \ - --dead-letter-config TargetArn=arn:aws:sns:us-east-1:000000000000:failed-resize-topic \ - --role arn:aws:iam::000000000000:role/lambda-role \ - --environment Variables="{STAGE=local}" -awslocal lambda wait function-active-v2 --function-name resize -awslocal lambda put-function-event-invoke-config \ - --function-name resize \ - --maximum-event-age-in-seconds 3600 \ - --maximum-retry-attempts 0 -``` +## Step 3 — Test the API -#### Connect S3 bucket to Resizer Lambda +Store a message: ```bash -awslocal s3api put-bucket-notification-configuration \ - --bucket localstack-thumbnails-app-images \ - --notification-configuration "{\"LambdaFunctionConfigurations\": [{\"LambdaFunctionArn\": \"$(awslocal lambda get-function --function-name resize --output json | jq -r .Configuration.FunctionArn)\", \"Events\": [\"s3:ObjectCreated:*\"]}]}" +curl -X POST "$LAMBDA_URL" \ + -H "Content-Type: application/json" \ + -d '{"message": "Hello, LocalStack!"}' ``` -#### Create the S3 static website +You should get back a response like: -```bash -awslocal s3 mb s3://webapp -awslocal s3 sync --delete ./website s3://webapp -awslocal s3 website s3://webapp --index-document index.html +```json +{"id": "a1b2c3d4-...", "message": "Hello, LocalStack!"} ``` -#### Retrieve the Lambda Function URLs - -Retrieve the Lambda function URLs for the `presign` and `list` Lambda functions using the following commands: +List all messages: ```bash -awslocal lambda list-function-url-configs --function-name presign --output json | jq -r '.FunctionUrlConfigs[0].FunctionUrl' -awslocal lambda list-function-url-configs --function-name list --output json | jq -r '.FunctionUrlConfigs[0].FunctionUrl' +curl "$LAMBDA_URL" ``` -Save these URLs for later use in the sample application. - -### Run the sample AWS application - -To access the application, go to [**https://webapp.s3-website.localhost.localstack.cloud:4566**](https://webapp.s3-website.localhost.localstack.cloud:4566) in your browser. - -![Serverless image resizer application](/images/aws/serverless-image-resizer-application.png) - -Paste the `presign` and `list` Lambda function URLs into the application and click **Apply**. -Alternatively, click on **Load from API** to automatically load the URLs. +**That's the win.** You just invoked a real Lambda function that wrote to a real DynamoDB table — all running locally, with no AWS account and no cloud costs. -Upload an image, and click **Upload**. -The upload form uses the `presign` Lambda to request an S3 pre-signed POST URL, forwarding the POST request to S3. -Asynchronous resizing (maximum 400x400 pixels) occurs through S3 bucket notifications. +## Step 4 — Inspect your resources -If successful, the application displays a **success!** alert. -Click **Refresh** to trigger your browser to request the `list` Lambda URL, returning a JSON document of all items in the images (`localstack-thumbnails-app-images`) and resized images (`localstack-thumbnails-app-resized`) bucket. +You can browse the resources you just deployed in the [LocalStack Web Application](https://app.localstack.cloud/). +Navigate to your [Default Instance](https://app.localstack.cloud/inst/default/status) and click through to [Lambda](https://app.localstack.cloud/inst/default/resources/lambda/functions) or [DynamoDB](https://app.localstack.cloud/inst/default/resources/dynamodb) to see your running infrastructure. -![Serverless image resizer application displaying a resized image](/images/aws/resized-image-sample-application.png) +## Step 5 — Clean up -### View the deployed resources - -You can inspect the resources deployed as part of the sample application by accessing the [**LocalStack Web Application**](https://app.localstack.cloud/). -Navigate to your [**Default Instance**](https://app.localstack.cloud/inst/default/status) to view the deployed resources. - -![Status Page of the LocalStack Web Application"](/images/aws/localstack-web-application-status.png) - -Click on [S3](https://app.localstack.cloud/inst/default/resources/s3) or [Lambda](https://app.localstack.cloud/inst/default/resources/lambda/functions) to view the S3 buckets and Lambda functions respectively. - -![The Lambda Resource Browser Page of the LocalStack Web Application](/images/aws/localstack-web-application-lambda.png) - -### Run integration tests - -To run automated integration tests against the sample application, use the following command: - -```bash -pytest -v -``` - -Additionally, you can verify that when the `resize` Lambda fails, an SNS message is sent to a topic that an SES subscription listens to, triggering an email with the raw failure message. -Since there's no real email server involved, you can use the LocalStack SES developer endpoint to list messages sent via SES: +When you're done, stop LocalStack to tear down all local resources: ```bash -curl -s http://localhost.localstack.cloud:4566/_aws/ses | jq +lstk stop # if using lstk +localstack stop # if using the LocalStack CLI ``` -An alternative option is to use a service like MailHog or `smtp4dev`. -Start LocalStack with `SMTP_HOST=host.docker.internal:1025`, pointing to the mock SMTP server. - -### Destroy the local infrastructure - -Now that you've learned how to deploy a local AWS infrastructure for your sample application, let's clean up and tear down the resources associated with the project: - -```bash -localstack stop -``` - -LocalStack is ephemeral, meaning it doesn't persist any data across restarts. -It runs inside a Docker container, and once it's stopped, all locally created resources are automatically removed. - -To persist the local cloud resources across restarts, navigate to our [persistence documentation](/aws/capabilities/state-management/persistence) or learn about [Cloud Pods](/aws/capabilities/state-management/cloud-pods), our next generation state management utility. - -## Next Steps +LocalStack is ephemeral by default — stopping it removes all provisioned resources. +To persist state across restarts, see [Persistence](/aws/capabilities/state-management/persistence/) or [Cloud Pods](/aws/capabilities/state-management/cloud-pods/). -Congratulations on deploying an AWS application locally using LocalStack! -To expand your LocalStack capabilities, explore the following based on your expertise: +## Next steps -- [Tutorials](/aws/tutorials): Check out our tutorials to learn how to use LocalStack across various AWS services and application stacks. -- [Supported Services](/aws/services): Explore LocalStack's emulated AWS services. -- [Capabilities](/aws/capabilities/): Learn about LocalStack's capabilities including features like IAM policy stream, state management, and more. -- [Tooling](/aws/tooling/): Get details on LocalStack's tooling and integrations. -- [Blog](https://blog.localstack.cloud): Read our blog posts about LocalStack and the latest enhancements for a better local development and testing experience. +- [Tutorials](/aws/tutorials/) — Deeper dives into specific AWS services and application stacks +- [Supported Services](/aws/services/) — Full list of emulated AWS services +- [CI/CD Setup](/aws/getting-started/ci-cd/) — Run LocalStack in GitHub Actions and other pipelines +- [AI & Agent Workflows](/aws/getting-started/ai-workflows/) — Use LocalStack with AI coding tools and agents +- [Tooling](/aws/tooling/) — `awslocal`, `tflocal`, LocalStack Desktop, and more From 6ea3ae46d9a8888c5b222c9de5f8d359c3e2692c Mon Sep 17 00:00:00 2001 From: Brian Rinaldi Date: Fri, 24 Apr 2026 14:47:40 -0400 Subject: [PATCH 02/58] Update quickstart.mdx --- src/content/docs/aws/getting-started/quickstart.mdx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/content/docs/aws/getting-started/quickstart.mdx b/src/content/docs/aws/getting-started/quickstart.mdx index f44442699..687b87338 100644 --- a/src/content/docs/aws/getting-started/quickstart.mdx +++ b/src/content/docs/aws/getting-started/quickstart.mdx @@ -5,6 +5,7 @@ template: doc sidebar: order: 2 --- + import { Tabs, TabItem } from '@astrojs/starlight/components'; ## Introduction @@ -24,7 +25,7 @@ Choose your preferred deployment style below: **AWS CLI** (`awslocal`) or **Terr ## Prerequisites - [Docker](https://docs.docker.com/get-docker/) installed and running -- A [LocalStack account](https://app.localstack.cloud/sign-up) (free tier works) +- A [LocalStack account](https://app.localstack.cloud/sign-up) ## Step 1 — Install and start LocalStack @@ -54,6 +55,7 @@ The fastest way to get LocalStack running locally is with `lstk`, a lightweight `lstk` currently supports core lifecycle commands (start, stop, logs, status). For advanced features like Cloud Pods, Extensions, and Ephemeral Instances, use the [LocalStack CLI](/aws/getting-started/installation/#localstack-cli) instead. ::: + If you prefer the full-featured LocalStack CLI, [install it first](/aws/getting-started/installation/#localstack-cli), then [configure your auth token](/aws/getting-started/auth-token/), and start LocalStack: @@ -61,6 +63,7 @@ The fastest way to get LocalStack running locally is with `lstk`, a lightweight ```bash localstack start ``` + @@ -143,6 +146,7 @@ Now deploy a Lambda function and a DynamoDB table. Pick the tooling you prefer: --output text) echo $LAMBDA_URL ``` + Install Terraform and the `tflocal` wrapper: @@ -241,6 +245,7 @@ Now deploy a Lambda function and a DynamoDB table. Pick the tooling you prefer: LAMBDA_URL=$(tflocal output -raw function_url) echo $LAMBDA_URL ``` + @@ -257,7 +262,7 @@ curl -X POST "$LAMBDA_URL" \ You should get back a response like: ```json -{"id": "a1b2c3d4-...", "message": "Hello, LocalStack!"} +{ "id": "a1b2c3d4-...", "message": "Hello, LocalStack!" } ``` List all messages: From 71369d638c82c8f76090482ccbd711ed083bc30c Mon Sep 17 00:00:00 2001 From: Brian Rinaldi Date: Tue, 28 Apr 2026 07:46:48 -0400 Subject: [PATCH 03/58] Clean up the ordering Fixed some issues on the quick start and reordered the pages to make a more logical order --- .../docs/aws/getting-started/ai-workflows.mdx | 10 +- .../docs/aws/getting-started/auth-token.mdx | 2 +- .../docs/aws/getting-started/ci-cd.mdx | 24 +- .../docs/aws/getting-started/installation.mdx | 118 ++++-- .../docs/aws/getting-started/quickstart.mdx | 401 ++++++++++-------- 5 files changed, 323 insertions(+), 232 deletions(-) diff --git a/src/content/docs/aws/getting-started/ai-workflows.mdx b/src/content/docs/aws/getting-started/ai-workflows.mdx index 4746e4ff5..224690374 100644 --- a/src/content/docs/aws/getting-started/ai-workflows.mdx +++ b/src/content/docs/aws/getting-started/ai-workflows.mdx @@ -3,7 +3,7 @@ title: AI & Agent Workflows description: Use LocalStack with AI coding assistants, MCP servers, and agent-driven infrastructure automation. template: doc sidebar: - order: 6 + order: 5 --- ## Overview @@ -66,8 +66,8 @@ See [Tooling](/aws/tooling/) for the full list of LocalStack-aware wrappers for ## Summary -| Use case | Tool | -|---|---| +| Use case | Tool | +| ------------------------------------------------------ | ---------------------------------------------------------------------------- | | AI assistant that can inspect & manage local resources | [LocalStack MCP Server](https://github.com/localstack/localstack-mcp-server) | -| Agent-driven infrastructure deployment | [LocalStack Skills](https://github.com/localstack/skills) | -| Validate AI-generated IaC safely | LocalStack + `tflocal` / `cdklocal` / `awslocal` | +| Agent-driven infrastructure deployment | [LocalStack Skills](https://github.com/localstack/skills) | +| Validate AI-generated IaC safely | LocalStack + `tflocal` / `cdklocal` / `awslocal` | diff --git a/src/content/docs/aws/getting-started/auth-token.mdx b/src/content/docs/aws/getting-started/auth-token.mdx index 4f6446c00..b35141c90 100644 --- a/src/content/docs/aws/getting-started/auth-token.mdx +++ b/src/content/docs/aws/getting-started/auth-token.mdx @@ -3,7 +3,7 @@ title: Auth Token description: Configure your Auth Token to access and activate LocalStack. template: doc sidebar: - order: 4 + order: 6 --- import { Code, Tabs, TabItem } from '@astrojs/starlight/components'; diff --git a/src/content/docs/aws/getting-started/ci-cd.mdx b/src/content/docs/aws/getting-started/ci-cd.mdx index feac59510..594ffed2c 100644 --- a/src/content/docs/aws/getting-started/ci-cd.mdx +++ b/src/content/docs/aws/getting-started/ci-cd.mdx @@ -1,16 +1,16 @@ --- -title: CI/CD Setup +title: CI/CD description: Run LocalStack in CI pipelines — auth tokens, Docker Compose, and GitHub Actions examples. template: doc sidebar: - order: 5 + order: 4 --- import { Tabs, TabItem } from '@astrojs/starlight/components'; ## Overview -LocalStack works great in CI environments. +LocalStack works great in CI environments, allowing your integration tests to run incredibly fast and with no cloud costs. The setup differs from local development in a few important ways: - **Use a CI Auth Token**, not your personal Developer token @@ -67,6 +67,7 @@ See the [Auth Token documentation](/aws/getting-started/auth-token/) for full de ``` The `setup-localstack` action handles pulling the image, starting the container, and waiting for LocalStack to be ready. + Add LocalStack as a service in your `docker-compose.yml`: @@ -99,6 +100,7 @@ See the [Auth Token documentation](/aws/getting-started/auth-token/) for full de :::note Mounting `/var/run/docker.sock` is required for Lambda emulation, which uses Docker to run function containers. ::: + Start LocalStack directly with `docker run`: @@ -116,6 +118,7 @@ See the [Auth Token documentation](/aws/getting-started/auth-token/) for full de # Wait for readiness until curl -s http://localhost:4566/_localstack/health | grep -q '"running"'; do sleep 1; done ``` + Add LocalStack as a service in your CircleCI config: @@ -142,6 +145,7 @@ See the [Auth Token documentation](/aws/getting-started/auth-token/) for full de ``` Set `LOCALSTACK_AUTH_TOKEN` in your CircleCI project's environment variables. + @@ -156,13 +160,13 @@ curl -s http://localhost:4566/_localstack/info | jq '.is_license_activated' ## Key differences from local development -| | Local development | CI/CD | -|---|---|---| -| **CLI** | `lstk` or LocalStack CLI | Docker Compose / `docker run` | -| **Auth** | Browser login or stored token | `LOCALSTACK_AUTH_TOKEN` env var | -| **Token type** | Developer token | CI token | -| **State** | Optional persistence | Ephemeral (fresh per run) | -| **Startup** | Interactive TUI | `--non-interactive` / `-d` flag | +| | Local development | CI/CD | +| -------------- | ----------------------------- | ------------------------------- | +| **CLI** | `lstk` or LocalStack CLI | Docker Compose / `docker run` | +| **Auth** | Browser login or stored token | `LOCALSTACK_AUTH_TOKEN` env var | +| **Token type** | Developer token | CI token | +| **State** | Optional persistence | Ephemeral (fresh per run) | +| **Startup** | Interactive TUI | `--non-interactive` / `-d` flag | ## Persisting state across runs diff --git a/src/content/docs/aws/getting-started/installation.mdx b/src/content/docs/aws/getting-started/installation.mdx index dcc080ab8..e6239ce0d 100644 --- a/src/content/docs/aws/getting-started/installation.mdx +++ b/src/content/docs/aws/getting-started/installation.mdx @@ -3,11 +3,11 @@ title: Installation description: All installation methods for LocalStack — lstk, LocalStack CLI, Docker Compose, Docker, and Helm. template: doc sidebar: - order: 3 + order: 2 --- import { Code, LinkButton, Tabs, TabItem } from '@astrojs/starlight/components'; -import { LOCALSTACK_VERSION } from "astro:env/server"; +import { LOCALSTACK_VERSION } from 'astro:env/server'; ## Local development @@ -28,17 +28,13 @@ Install `lstk`: - ```bash - brew install localstack/tap/lstk - ``` - - - ```bash - npm install -g @localstack/lstk - ``` + ```bash brew install localstack/tap/lstk ``` + ```bash npm install -g @localstack/lstk ``` - Download a pre-built binary for your platform from [GitHub Releases](https://github.com/localstack/lstk/releases) and add it to your `PATH`. + Download a pre-built binary for your platform from [GitHub + Releases](https://github.com/localstack/lstk/releases) and add it to your + `PATH`. @@ -70,22 +66,43 @@ For alternative methods of managing the LocalStack container, see our [alternati You can download the pre-built binary for your architecture using the link below: -x86-64 -ARM64 + + x86-64 + + + ARM64 + or use the curl commands below: For x86-64: - + For ARM64: - + Then extract the LocalStack CLI from the terminal: - +
Alternative: Homebrew on Linux @@ -95,6 +112,7 @@ If you are using [Homebrew for Linux](https://docs.brew.sh/Homebrew-on-Linux), y ```bash brew install localstack/tap/localstack-cli ``` +
@@ -112,16 +130,28 @@ brew install localstack/tap/localstack-cli You may download the binary for your architecture using the link below: -Intel (AMD64) + + Intel (AMD64) + or use the following curl command: - + Then extract the LocalStack CLI from the terminal: - + @@ -130,9 +160,16 @@ Then extract the LocalStack CLI from the terminal: You can download the pre-built binary for your architecture using the link below: -Intel (AMD64) + + Intel (AMD64) + Then extract the archive and execute the binary in Powershell. + @@ -156,8 +193,8 @@ To download a specific version of LocalStack, replace `` with the requi ```bash python3 -m pip install localstack== ``` -::: +::: :::tip[MacOS Sierra?] If you have problems with permissions in MacOS X Sierra, install with: @@ -165,6 +202,7 @@ If you have problems with permissions in MacOS X Sierra, install with: ```bash python3 -m pip install --user localstack ``` + ::: :::danger @@ -183,7 +221,6 @@ To verify that the LocalStack CLI was installed correctly, you can check the ver You are all set! - :::note To start LocalStack, you must first [set up your auth token](/aws/getting-started/auth-token). ::: @@ -200,7 +237,7 @@ localstack start # start localstack in background with -d flag / / / __ \/ ___/ __ `/ /\__ \/ __/ __ `/ ___/ //_/ / /___/ /_/ / /__/ /_/ / /___/ / /_/ /_/ / /__/ ,< /_____/\____/\___/\__,_/_//____/\__/\__,_/\___/_/|_| - + 💻 LocalStack CLI ${LOCALSTACK_VERSION} 👤 Profile: default @@ -211,7 +248,6 @@ localstack start # start localstack in background with -d flag [12:47:15] detaching bootstrap.py:1262 ``` - ### Updating LocalStack CLI The LocalStack CLI allows you to easily update the different components of LocalStack. @@ -287,24 +323,23 @@ Docker Compose v1.9.0 and above is supported. ```yaml showshowLineNumbers services: localstack: - container_name: "${LOCALSTACK_DOCKER_NAME:-localstack-main}" - image: localstack/localstack-pro # required for Pro + container_name: '${LOCALSTACK_DOCKER_NAME:-localstack-main}' + image: localstack/localstack-pro # required for Pro ports: - - "127.0.0.1:4566:4566" # LocalStack Gateway - - "127.0.0.1:4510-4559:4510-4559" # external services port range - - "127.0.0.1:443:443" # LocalStack HTTPS Gateway (Pro) + - '127.0.0.1:4566:4566' # LocalStack Gateway + - '127.0.0.1:4510-4559:4510-4559' # external services port range + - '127.0.0.1:443:443' # LocalStack HTTPS Gateway (Pro) environment: # Activate LocalStack for AWS: https://docs.localstack.cloud/getting-started/auth-token/ - - LOCALSTACK_AUTH_TOKEN=${LOCALSTACK_AUTH_TOKEN:?} # required for Pro + - LOCALSTACK_AUTH_TOKEN=${LOCALSTACK_AUTH_TOKEN:?} # required for Pro # LocalStack configuration: https://docs.localstack.cloud/references/configuration/ - DEBUG=${DEBUG:-0} - PERSISTENCE=${PERSISTENCE:-0} volumes: - - "${LOCALSTACK_VOLUME_DIR:-./volume}:/var/lib/localstack" - - "/var/run/docker.sock:/var/run/docker.sock" + - '${LOCALSTACK_VOLUME_DIR:-./volume}:/var/lib/localstack' + - '/var/run/docker.sock:/var/run/docker.sock' ``` - Start the container by running the following command: ```bash @@ -312,6 +347,7 @@ docker compose up ``` :::note + - This command pulls the current nightly build from the `main` branch (if you don't have the image locally) and **not** the latest supported version. If you want to use a specific version, set the appropriate LocalStack image tag at `services.localstack.image` in the `docker-compose.yml` file (for example `localstack/localstack:`). @@ -330,7 +366,7 @@ docker compose up Please consider removing it, if this functionality is needed. - To configure an Auth Token, refer to the [Auth Token](/aws/getting-started/auth-token) documentation. -::: + ::: Please note that there are a few pitfalls when configuring your stack manually via docker-compose (e.g., required container name, Docker network, volume mounts, and environment variables). We recommend using the LocalStack CLI to validate your configuration, which will print warning messages in case it detects any potential misconfigurations: @@ -366,6 +402,7 @@ docker run \ ``` :::note + - This command pulls the current nightly build from the `main` branch (if you don't have the image locally) and **not** the latest supported version. If you want to use a specific version of LocalStack, use the appropriate tag: `docker run --rm -it -p 4566:4566 -p 4510-4559:4510-4559 localstack/localstack:`. Check-out the [LocalStack releases](https://github.com/localstack/localstack/releases) to know more about specific LocalStack versions. @@ -386,7 +423,7 @@ docker run \ For instance, setting `LOCALSTACK_PERSISTENCE=1` is equivalent to `PERSISTENCE=1`. - To configure an Auth Token, refer to the [Auth Token](/aws/getting-started/auth-token) documentation. -::: + ::: ### Helm @@ -400,6 +437,7 @@ If you want to deploy LocalStack in your [Kubernetes](https://kubernetes.io) clu #### Deploy LocalStack using Helm You can deploy LocalStack in a Kubernetes cluster by running these commands: + ```bash helm repo add localstack-repo https://helm.localstack.cloud helm upgrade --install localstack localstack-repo/localstack @@ -410,6 +448,7 @@ The Helm charts are not maintained in the main repository, but in a [separate on ## What's next? Now that you have LocalStack up and running, the following resources might be useful for your next steps: + - Check out our [Quickstart guide](/aws/getting-started/quickstart) if you are a new user to get started with LocalStack quickly. - [Use the LocalStack integrations](/aws/integrations) to interact with LocalStack and other integrated tools, for example: - Use `awslocal` to use the AWS CLI against your local cloud! @@ -425,10 +464,12 @@ Now that you have LocalStack up and running, the following resources might be us #### The LocalStack CLI installation is successful, but I cannot execute `localstack` If you can successfully install LocalStack using `pip` but you cannot use it in your terminal, you most likely haven't set up your operating system's / terminal's `PATH` variable (in order to tell them where to find programs installed via `pip`). + - If you are using Windows, you can enable the `PATH` configuration when installing Python, [as described in the official docs of Python](https://docs.python.org/3/using/windows.html#finding-the-python-executable). - If you are using a MacOS or Linux operating system, please make sure that the `PATH` is correctly set up - either system wide, or in your terminal. As a workaround you can call the LocalStack CLI python module directly: + ```bash python3 -m localstack.cli.main ``` @@ -436,12 +477,15 @@ python3 -m localstack.cli.main #### The `localstack` CLI does not start the LocalStack container If you are using the `localstack` CLI to start LocalStack, but the container is not starting, please check the following: + - Uncheck the **Use kernel networking for UDP** option in Docker Desktop (**Settings** → **Resources** → **Network**) or follow the steps in our [documentation](/aws/tooling/dns-server#system-dns-configuration) to disable it. - Start LocalStack with a specific DNS address: + ```bash DNS_ADDRESS=0 localstack start ``` -- Remove port 53 as indicated in our [standard `docker-compose.yml` file](https://github.com/localstack/localstack/blob/main/docker-compose-pro.yml). + +- Remove port 53 as indicated in our [standard `docker-compose.yml` file](https://github.com/localstack/localstack/blob/main/docker-compose-pro.yml). #### How should I access the LocalStack logs on my local machine? diff --git a/src/content/docs/aws/getting-started/quickstart.mdx b/src/content/docs/aws/getting-started/quickstart.mdx index 687b87338..00f268b73 100644 --- a/src/content/docs/aws/getting-started/quickstart.mdx +++ b/src/content/docs/aws/getting-started/quickstart.mdx @@ -1,16 +1,16 @@ --- -title: Quickstart +title: Local Development description: Deploy a serverless API locally with LocalStack in under 10 minutes using Lambda and DynamoDB. template: doc sidebar: - order: 2 + order: 3 --- -import { Tabs, TabItem } from '@astrojs/starlight/components'; +import { Tabs, TabItem, Steps } from '@astrojs/starlight/components'; ## Introduction -In this quickstart you'll start LocalStack and deploy a simple serverless API — a **Lambda function backed by DynamoDB** — entirely on your local machine. +In this quickstart you'll start LocalStack and deploy a simple serverless API including a Lambda function backed by DynamoDB, entirely on your local machine. No AWS account needed. By the end you will have: @@ -18,9 +18,9 @@ By the end you will have: - LocalStack running locally in Docker - A Lambda function deployed and invokable via a public URL - A DynamoDB table storing data written by the Lambda -- Confirmed that your local environment behaves like real AWS +- A local environment that behaves like real AWS -Choose your preferred deployment style below: **AWS CLI** (`awslocal`) or **Terraform** (`tflocal`). +Choose your preferred deployment style below: **AWS CLI** or **Terraform**. ## Prerequisites @@ -46,10 +46,19 @@ The fastest way to get LocalStack running locally is with `lstk`, a lightweight Then start LocalStack: ```bash - lstk start + lstk ``` - On first run, `lstk` opens a browser login to authenticate, then pulls the image and starts the container automatically. + On first run, `lstk` opens a browser window to authenticate. It also pulls the LocalStack image and starts the container automatically. + + When the container is ready, you'll see log lines like: + + ```bash + ✔︎ LocalStack ready (containerId: 400b3e61f3c6) + • Endpoint: localhost.localstack.cloud:4566 + • Web app: https://app.localstack.cloud + > Tip: View deployed resources: lstk status + ``` :::note[Early release] `lstk` currently supports core lifecycle commands (start, stop, logs, status). @@ -64,188 +73,213 @@ The fastest way to get LocalStack running locally is with `lstk`, a lightweight localstack start ``` - - + When the container is ready, you'll see log lines like: -Wait for the container to report ready — you'll see a log line like `Ready.` or you can verify with: + ```bash + __ _______ __ __ + / / ____ _________ _/ / ___// /_____ ______/ /__ + / / / __ \/ ___/ __ `/ /\__ \/ __/ __ `/ ___/ //_/ + / /___/ /_/ / /__/ /_/ / /___/ / /_/ /_/ / /__/ ,< + /_____/\____/\___/\__,_/_//____/\__/\__,_/\___/_/|_| + + 💻 LocalStack CLI ${LOCALSTACK_VERSION} + 👤 Profile: default + + [12:47:13] starting LocalStack in Docker mode 🐳 localstack.py:494 + preparing environment bootstrap.py:1240 + configuring container bootstrap.py:1248 + starting container bootstrap.py:1258 + [12:47:15] detaching bootstrap.py:1262 + ``` -```bash -curl -s http://localhost:4566/_localstack/health | grep '"running"' -``` + + ## Step 2 — Deploy the serverless API -Now deploy a Lambda function and a DynamoDB table. Pick the tooling you prefer: +Now deploy a Lambda function and a DynamoDB table. For this tutorial, you can choose between creating resources using the AWS CLI via our `awslocal` wrapper or Terraform via our `tflocal` wrapper. - Install the `awslocal` wrapper if you haven't already: - - ```bash - pip install awscli-local - ``` - - **Create the Lambda function:** - - ```bash - mkdir -p /tmp/localstack-demo - cat > /tmp/localstack-demo/handler.py << 'EOF' - import json, boto3, os, uuid - - def handler(event, context): - table = boto3.resource('dynamodb').Table(os.environ['TABLE_NAME']) - method = event.get('requestContext', {}).get('http', {}).get('method', 'GET') - if method == 'POST': - item = {'id': str(uuid.uuid4()), **json.loads(event.get('body', '{}'))} - table.put_item(Item=item) - return {'statusCode': 200, 'body': json.dumps(item)} - result = table.scan() - return {'statusCode': 200, 'body': json.dumps(result['Items'])} - EOF - cd /tmp/localstack-demo && zip handler.zip handler.py - ``` - - **Create the DynamoDB table:** - - ```bash - awslocal dynamodb create-table \ - --table-name Messages \ - --attribute-definitions AttributeName=id,AttributeType=S \ - --key-schema AttributeName=id,KeyType=HASH \ - --billing-mode PAY_PER_REQUEST - ``` - - **Deploy the Lambda:** - - ```bash - awslocal lambda create-function \ - --function-name messages-api \ - --runtime python3.12 \ - --handler handler.handler \ - --zip-file fileb:///tmp/localstack-demo/handler.zip \ - --role arn:aws:iam::000000000000:role/lambda-role \ - --environment Variables={TABLE_NAME=Messages} - - awslocal lambda wait function-active --function-name messages-api - ``` - - **Create a public function URL:** - - ```bash - awslocal lambda create-function-url-config \ - --function-name messages-api \ - --auth-type NONE - ``` - - **Retrieve the URL:** - - ```bash - LAMBDA_URL=$(awslocal lambda list-function-url-configs \ - --function-name messages-api \ - --query 'FunctionUrlConfigs[0].FunctionUrl' \ - --output text) - echo $LAMBDA_URL - ``` + + +1. Install the `awslocal` wrapper if you haven't already: + + ```bash + pip install awscli-local + ``` + +2. Create the Lambda function + + The below code creates a Lambda function using Python and zips the code to be ready for deployment. + + ```bash + mkdir -p /tmp/localstack-demo + cat > /tmp/localstack-demo/handler.py << 'EOF' + import json, boto3, os, uuid + + def handler(event, context): + table = boto3.resource('dynamodb').Table(os.environ['TABLE_NAME']) + method = event.get('requestContext', {}).get('http', {}).get('method', 'GET') + if method == 'POST': + item = {'id': str(uuid.uuid4()), **json.loads(event.get('body', '{}'))} + table.put_item(Item=item) + return {'statusCode': 200, 'body': json.dumps(item)} + result = table.scan() + return {'statusCode': 200, 'body': json.dumps(result['Items'])} + EOF + cd /tmp/localstack-demo && zip handler.zip handler.py + ``` + +3. Create the DynamoDB table + + ```bash + awslocal dynamodb create-table \ + --table-name Messages \ + --attribute-definitions AttributeName=id,AttributeType=S \ + --key-schema AttributeName=id,KeyType=HASH \ + --billing-mode PAY_PER_REQUEST + ``` + +4. Deploy the Lambda + + ```bash + awslocal lambda create-function \ + --function-name messages-api \ + --runtime python3.12 \ + --handler handler.handler \ + --zip-file fileb:///tmp/localstack-demo/handler.zip \ + --role arn:aws:iam::000000000000:role/lambda-role \ + --environment Variables={TABLE_NAME=Messages} + + awslocal lambda wait function-active --function-name messages-api + ``` + +5. Create a public function URL + + ```bash + awslocal lambda create-function-url-config \ + --function-name messages-api \ + --auth-type NONE + ``` + +6. Retrieve the URL + + ```bash + LAMBDA_URL=$(awslocal lambda list-function-url-configs \ + --function-name messages-api \ + --query 'FunctionUrlConfigs[0].FunctionUrl' \ + --output text) + echo $LAMBDA_URL + ``` + + - Install Terraform and the `tflocal` wrapper: + +1. Install Terraform and the `tflocal` wrapper: ```bash - brew install hashicorp/tap/terraform # or see https://developer.hashicorp.com/terraform/install + brew install hashicorp/tap/terraform pip install terraform-local ``` - Create a project directory and `main.tf`: - - ```bash - mkdir -p /tmp/localstack-demo && cd /tmp/localstack-demo - ``` - - ```hcl - # main.tf - terraform { - required_providers { - aws = { source = "hashicorp/aws" } - archive = { source = "hashicorp/archive" } - } - } - - resource "aws_dynamodb_table" "messages" { - name = "Messages" - billing_mode = "PAY_PER_REQUEST" - hash_key = "id" - attribute { - name = "id" - type = "S" - } - } - - data "archive_file" "lambda" { - type = "zip" - output_path = "${path.module}/handler.zip" - source { - filename = "handler.py" - content = <<-EOF - import json, boto3, os, uuid - def handler(event, context): - table = boto3.resource('dynamodb').Table(os.environ['TABLE_NAME']) - method = event.get('requestContext', {}).get('http', {}).get('method', 'GET') - if method == 'POST': - item = {'id': str(uuid.uuid4()), **json.loads(event.get('body', '{}'))} - table.put_item(Item=item) - return {'statusCode': 200, 'body': json.dumps(item)} - result = table.scan() - return {'statusCode': 200, 'body': json.dumps(result['Items'])} - EOF - } - } - - resource "aws_iam_role" "lambda_role" { - name = "lambda-role" - assume_role_policy = jsonencode({ - Version = "2012-10-17" - Statement = [{ Action = "sts:AssumeRole", Effect = "Allow", - Principal = { Service = "lambda.amazonaws.com" } }] - }) - } - - resource "aws_lambda_function" "messages_api" { - function_name = "messages-api" - runtime = "python3.12" - handler = "handler.handler" - filename = data.archive_file.lambda.output_path - source_code_hash = data.archive_file.lambda.output_base64sha256 - role = aws_iam_role.lambda_role.arn - environment { - variables = { TABLE_NAME = aws_dynamodb_table.messages.name } - } - } - - resource "aws_lambda_function_url" "messages_api" { - function_name = aws_lambda_function.messages_api.function_name - authorization_type = "NONE" - } - - output "function_url" { - value = aws_lambda_function_url.messages_api.function_url - } - ``` - - **Deploy:** - - ```bash - tflocal init - tflocal apply -auto-approve - ``` - - **Retrieve the URL:** - - ```bash - LAMBDA_URL=$(tflocal output -raw function_url) - echo $LAMBDA_URL - ``` - + For additional installation options, see the [Terraform installation guide](https://developer.hashicorp.com/terraform/install). + +2. Create a project directory. + + ```bash + mkdir -p /tmp/localstack-demo && cd /tmp/localstack-demo + ``` + + Then create a `main.tf` file with the following content: + + ```hcl + # main.tf + terraform { + required_providers { + aws = { source = "hashicorp/aws" } + archive = { source = "hashicorp/archive" } + } + } + + resource "aws_dynamodb_table" "messages" { + name = "Messages" + billing_mode = "PAY_PER_REQUEST" + hash_key = "id" + attribute { + name = "id" + type = "S" + } + } + + data "archive_file" "lambda" { + type = "zip" + output_path = "${path.module}/handler.zip" + source { + filename = "handler.py" + content = <<-EOF + import json, boto3, os, uuid + def handler(event, context): + table = boto3.resource('dynamodb').Table(os.environ['TABLE_NAME']) + method = event.get('requestContext', {}).get('http', {}).get('method', 'GET') + if method == 'POST': + item = {'id': str(uuid.uuid4()), **json.loads(event.get('body', '{}'))} + table.put_item(Item=item) + return {'statusCode': 200, 'body': json.dumps(item)} + result = table.scan() + return {'statusCode': 200, 'body': json.dumps(result['Items'])} + EOF + } + } + + resource "aws_iam_role" "lambda_role" { + name = "lambda-role" + assume_role_policy = jsonencode({ + Version = "2012-10-17" + Statement = [{ Action = "sts:AssumeRole", Effect = "Allow", + Principal = { Service = "lambda.amazonaws.com" } }] + }) + } + + resource "aws_lambda_function" "messages_api" { + function_name = "messages-api" + runtime = "python3.12" + handler = "handler.handler" + filename = data.archive_file.lambda.output_path + source_code_hash = data.archive_file.lambda.output_base64sha256 + role = aws_iam_role.lambda_role.arn + environment { + variables = { TABLE_NAME = aws_dynamodb_table.messages.name } + } + } + + resource "aws_lambda_function_url" "messages_api" { + function_name = aws_lambda_function.messages_api.function_name + authorization_type = "NONE" + } + + output "function_url" { + value = aws_lambda_function_url.messages_api.function_url + } + ``` + +3. Deploy + + ```bash + tflocal init + tflocal apply -auto-approve + ``` + +4. Retrieve the URL + + ```bash + LAMBDA_URL=$(tflocal output -raw function_url) + echo $LAMBDA_URL + ``` + + @@ -280,16 +314,25 @@ Navigate to your [Default Instance](https://app.localstack.cloud/inst/default/st ## Step 5 — Clean up -When you're done, stop LocalStack to tear down all local resources: +First, stop LocalStack to tear down all local resources: -```bash -lstk stop # if using lstk -localstack stop # if using the LocalStack CLI -``` +{/* prettier-ignore-start */} + + + ```bash lstk stop ``` + ```bash localstack stop ``` + +{/* prettier-ignore-end */} LocalStack is ephemeral by default — stopping it removes all provisioned resources. To persist state across restarts, see [Persistence](/aws/capabilities/state-management/persistence/) or [Cloud Pods](/aws/capabilities/state-management/cloud-pods/). +Now that you're done, you can remove the tutorial files from your machine (the Lambda source, zip, and, if you used Terraform, `main.tf` and state under the same folder): + +```bash +rm -rf /tmp/localstack-demo +``` + ## Next steps - [Tutorials](/aws/tutorials/) — Deeper dives into specific AWS services and application stacks From c778969deee249c6a1712a0cfca17e5ed992c105 Mon Sep 17 00:00:00 2001 From: Brian Rinaldi Date: Tue, 28 Apr 2026 08:45:42 -0400 Subject: [PATCH 04/58] Clean up CI-CD landing page --- .../docs/aws/getting-started/ci-cd.mdx | 36 +++++++++++-------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/src/content/docs/aws/getting-started/ci-cd.mdx b/src/content/docs/aws/getting-started/ci-cd.mdx index 594ffed2c..0618d8657 100644 --- a/src/content/docs/aws/getting-started/ci-cd.mdx +++ b/src/content/docs/aws/getting-started/ci-cd.mdx @@ -1,6 +1,6 @@ --- title: CI/CD -description: Run LocalStack in CI pipelines — auth tokens, Docker Compose, and GitHub Actions examples. +description: Run LocalStack in CI pipelines — auth tokens, Docker Compose, GitHub Actions examples, and persisting state with Cloud Pods or state export. template: doc sidebar: order: 4 @@ -11,15 +11,16 @@ import { Tabs, TabItem } from '@astrojs/starlight/components'; ## Overview LocalStack works great in CI environments, allowing your integration tests to run incredibly fast and with no cloud costs. -The setup differs from local development in a few important ways: +The setup differs slighty from local development in a few important ways: - **Use a CI Auth Token**, not your personal Developer token - **Manage the container directly** via Docker Compose or `docker run` — `lstk` and the LocalStack Desktop are local-only tools -- **LocalStack is ephemeral by default** — each CI run starts fresh, which is usually exactly what you want for reproducible tests +- **Runs are often isolated per job** — many pipelines start from an empty LocalStack instance for reproducible tests +- **Persistence in CI is supported** — [Cloud Pods](/aws/capabilities/state-management/cloud-pods/), snapshot-based [persistence](/aws/capabilities/state-management/persistence/) with a mounted volume, or `localstack state export` / `localstack state import` with artifacts or cache. ## Step 1 — Get a CI Auth Token -CI pipelines should use a dedicated CI Auth Token, not a Developer token tied to a specific user. +CI pipelines should use a dedicated CI Auth Token, not a developer token tied to a specific user. 1. Go to the [Auth Tokens page](https://app.localstack.cloud/workspace/auth-tokens) in the LocalStack Web Application 2. Create a new **CI Auth Token** @@ -52,9 +53,10 @@ See the [Auth Token documentation](/aws/getting-started/auth-token/) for full de - uses: actions/checkout@v4 - name: Start LocalStack - uses: LocalStack/setup-localstack@v0.2 + uses: LocalStack/setup-localstack@v0.2.2 with: image-tag: latest + install-awslocal: "true" env: LOCALSTACK_AUTH_TOKEN: ${{ secrets.LOCALSTACK_AUTH_TOKEN }} @@ -160,20 +162,24 @@ curl -s http://localhost:4566/_localstack/info | jq '.is_license_activated' ## Key differences from local development -| | Local development | CI/CD | -| -------------- | ----------------------------- | ------------------------------- | -| **CLI** | `lstk` or LocalStack CLI | Docker Compose / `docker run` | -| **Auth** | Browser login or stored token | `LOCALSTACK_AUTH_TOKEN` env var | -| **Token type** | Developer token | CI token | -| **State** | Optional persistence | Ephemeral (fresh per run) | -| **Startup** | Interactive TUI | `--non-interactive` / `-d` flag | +| | Local development | CI/CD | +| -------------- | ----------------------------- | ----------------------------------------------------------------------------------- | +| **CLI** | `lstk` or LocalStack CLI | Docker Compose / `docker run` | +| **Auth** | Browser login or stored token | `LOCALSTACK_AUTH_TOKEN` env var | +| **Token type** | Developer token | CI token | +| **State** | Optional persistence | Optional persistence (same mechanisms; typical pattern is a fresh instance per job) | +| **Startup** | Interactive TUI | `--non-interactive` / `-d` flag | ## Persisting state across runs -By default, LocalStack starts fresh on every run — all resources are gone when the container stops. -This is ideal for most CI use cases (clean, reproducible tests). +If you tear down the container at the end of a job, nothing is left on disk unless you save it — which is why many teams use a clean instance every time. +When you **do** need to reuse infrastructure or data between pipeline runs or steps, CI is fully supported: -If you need to share state across runs (e.g., seed data, pre-built infrastructure), look at [Cloud Pods](/aws/capabilities/state-management/cloud-pods/), which let you snapshot and restore LocalStack state. +- **[Cloud Pods](/aws/capabilities/state-management/cloud-pods/)** — save and load snapshots; the [`setup-localstack`](https://github.com/localstack/setup-localstack) action can load and save pods via `state-backend: cloud-pods` (see [GitHub Actions](/aws/integrations/continuous-integration/github-actions/) — _Store Localstack state_). +- **Snapshot-based [persistence](/aws/capabilities/state-management/persistence/)** — enable `PERSISTENCE=1` and mount a volume so state survives container restarts on the same runner or workspace. +- **State export/import** — run `localstack state export` and `localstack state import` and pass the file through your CI provider’s **artifacts**, **cache**, or attached storage (for example, see [GitLab CI](/aws/integrations/continuous-integration/gitlab-ci/) — _Store Localstack state_). + +Choose the approach that fits your runner model: for example, multi-job GitLab pipelines often need explicit state handoff because services do not carry between jobs. ## More CI integrations From 9ed0787d20584084592370047d08a8aef8f569fe Mon Sep 17 00:00:00 2001 From: Brian Rinaldi Date: Tue, 28 Apr 2026 16:01:01 -0400 Subject: [PATCH 05/58] Improvements to the AI page --- .../docs/aws/getting-started/ai-workflows.mdx | 66 ++++++++++++------- 1 file changed, 44 insertions(+), 22 deletions(-) diff --git a/src/content/docs/aws/getting-started/ai-workflows.mdx b/src/content/docs/aws/getting-started/ai-workflows.mdx index 224690374..7ab8e76e5 100644 --- a/src/content/docs/aws/getting-started/ai-workflows.mdx +++ b/src/content/docs/aws/getting-started/ai-workflows.mdx @@ -8,39 +8,61 @@ sidebar: ## Overview -LocalStack is a natural fit for AI-assisted development workflows. -Whether you're using an AI coding assistant to generate infrastructure code, running an agent that deploys AWS resources, or validating AI-generated Terraform before applying it to real AWS — LocalStack gives you a safe, fast, cost-free environment to do it in. +AI-assisted development workflows need a fast and secure environment to develop and test in. +Whether you're using an AI coding assistant to generate infrastructure code, running an agent that deploys AWS resources, or validating AI-generated IaC before applying it to real AWS — LocalStack gives you a safe, fast, cost-free environment to run these workflows in. ## Connect an AI coding assistant via MCP -The [LocalStack MCP Server](https://github.com/localstack/localstack-mcp-server) exposes LocalStack's API as an MCP (Model Context Protocol) tool server. -This lets AI assistants like Claude, Cursor, Windsurf, or any MCP-compatible tool inspect and interact with your running LocalStack instance directly. +The [LocalStack MCP Server](https://github.com/localstack/localstack-mcp-server) is a [Model Context Protocol](https://modelcontextprotocol.io/) (MCP) server that connects compatible clients (Claude, Cursor, Windsurf, and others) to your LocalStack environment. +It gives agents tools to run the full local cloud lifecycle—not only generating infrastructure code, but starting the container, deploying and tearing down IaC, analyzing logs, and more. +See [Introducing the LocalStack MCP Server](https://blog.localstack.cloud/introducing-localstack-mcp-server/) for the original announcement and walkthrough. -With the MCP server connected, your AI assistant can: +With the MCP server configured, your assistant can use tools such as: -- List running AWS services and deployed resources -- Create, update, and delete resources in your local environment -- Query resource state to understand what's already deployed -- Help you debug issues by inspecting live infrastructure +- **Lifecycle** — Start, stop, restart, or check status of the LocalStack container +- **Deploy** — Deploy or destroy CDK, Terraform, SAM, or CloudFormation projects on LocalStack +- **Operations** — Analyze logs, run AWS CLI commands via `awslocal`, manage [Cloud Pods](/aws/capabilities/state-management/cloud-pods/), and (where supported) IAM policy analysis, chaos injection, and docs search -**Quick setup:** +...and many more. -```bash -# Install the LocalStack MCP server -pip install localstack-mcp-server +### MCP Server Prerequisites + +Before you begin, make sure these are installed and in your system's `PATH`: + +- [Node.js](https://nodejs.org/en/) (v20.x or later) to run the `npx` command. +- [LocalStack CLI](https://docs.localstack.cloud/user-guide/cli/) and [Docker](https://docs.docker.com/get-docker/) to manage the LocalStack container itself. +- [`cdklocal`](https://docs.localstack.cloud/user-guide/integrations/aws-cdk/) or [`tflocal`](https://docs.localstack.cloud/user-guide/integrations/terraform/) to use the `localstack-deployer` tool. (optional) +- A [LocalStack Auth Token](https://docs.localstack.cloud/getting-started/auth-token/) to enable licensed features. (optional) + +### MCP Server Configuration + +Add a server entry like this to your client's MCP configuration—for **Cursor**, this would typically be `~/.cursor/mcp.json`. +For **Claude Code**, register the server with `claude mcp add` (it is saved to your project-level MCP configuration).. + +```json +{ + "mcpServers": { + "localstack-mcp-server": { + "command": "npx", + "args": ["-y", "@localstack/localstack-mcp-server"], + "env": { + "LOCALSTACK_AUTH_TOKEN": "" + } + } + } +} ``` -Then add it to your AI tool's MCP configuration. -See the [localstack-mcp-server README](https://github.com/localstack/localstack-mcp-server) for tool-specific setup instructions for Claude, Cursor, and others. +Full prerequisites, Cursor/VS Code/Claude Code variants, custom endpoints (`LOCALSTACK_HOSTNAME`, `LOCALSTACK_PORT`), troubleshooting, and the complete tool reference are on [LocalStack MCP Server](/aws/tooling/mcp-server/). :::note -The MCP server connects to a running LocalStack instance — make sure LocalStack is started first with `lstk start` or `localstack start`. +You do not need to start LocalStack manually before using MCP: an agent can start the container using the **localstack-management** tool once this configuration is in place. +If LocalStack already runs elsewhere, point the MCP server at it via the `env` block as described in [Connecting to a custom LocalStack endpoint](/aws/tooling/mcp-server/#connecting-to-a-custom-localstack-endpoint). ::: ## Deploy with agent-driven automation using Skills [LocalStack Skills](https://github.com/localstack/skills) are pre-built agent skill definitions for deploying common AWS architectures locally. -Instead of stepping through manual CLI commands, you describe what you want and an agent handles the deployment. Skills are useful when: @@ -66,8 +88,8 @@ See [Tooling](/aws/tooling/) for the full list of LocalStack-aware wrappers for ## Summary -| Use case | Tool | -| ------------------------------------------------------ | ---------------------------------------------------------------------------- | -| AI assistant that can inspect & manage local resources | [LocalStack MCP Server](https://github.com/localstack/localstack-mcp-server) | -| Agent-driven infrastructure deployment | [LocalStack Skills](https://github.com/localstack/skills) | -| Validate AI-generated IaC safely | LocalStack + `tflocal` / `cdklocal` / `awslocal` | +| Use case | Tool | +| ------------------------------------------------------ | --------------------------------------------------------- | +| AI assistant that can inspect & manage local resources | [LocalStack MCP Server](/aws/tooling/mcp-server/) | +| Agent-driven infrastructure deployment | [LocalStack Skills](https://github.com/localstack/skills) | +| Validate AI-generated IaC safely | LocalStack + `tflocal` / `cdklocal` / `awslocal` | From 0b1b0dd941021516d802ff0f65daeb0098d2e1bb Mon Sep 17 00:00:00 2001 From: Brian Rinaldi Date: Tue, 28 Apr 2026 16:39:00 -0400 Subject: [PATCH 06/58] Minor improvement to the AI page --- src/content/docs/aws/getting-started/ai-workflows.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/content/docs/aws/getting-started/ai-workflows.mdx b/src/content/docs/aws/getting-started/ai-workflows.mdx index 7ab8e76e5..51efca9d4 100644 --- a/src/content/docs/aws/getting-started/ai-workflows.mdx +++ b/src/content/docs/aws/getting-started/ai-workflows.mdx @@ -37,7 +37,7 @@ Before you begin, make sure these are installed and in your system's `PATH`: ### MCP Server Configuration Add a server entry like this to your client's MCP configuration—for **Cursor**, this would typically be `~/.cursor/mcp.json`. -For **Claude Code**, register the server with `claude mcp add` (it is saved to your project-level MCP configuration).. +For **Claude Code**, register the server with `claude mcp add` (it is saved to your project-level MCP configuration). ```json { @@ -62,7 +62,7 @@ If LocalStack already runs elsewhere, point the MCP server at it via the `env` b ## Deploy with agent-driven automation using Skills -[LocalStack Skills](https://github.com/localstack/skills) are pre-built agent skill definitions for deploying common AWS architectures locally. +[LocalStack Skills](https://github.com/localstack/skills) are pre-built agent skill definitions for deploying common AWS architectures locally. It contains skills for LocalStack lifecycle management, IaC deployment, state management and more. Skills can be used in combination with the MCP server to create a fully autonomous agent-driven workflow. Skills are useful when: From b73231c79c2353a720fe71e1b56b601f4af27e0b Mon Sep 17 00:00:00 2001 From: Brian Rinaldi Date: Tue, 28 Apr 2026 17:05:26 -0400 Subject: [PATCH 07/58] Some reworking of the intro and removal of outdated content --- .../docs/aws/getting-started/auth-token.mdx | 31 ++++++------------- 1 file changed, 9 insertions(+), 22 deletions(-) diff --git a/src/content/docs/aws/getting-started/auth-token.mdx b/src/content/docs/aws/getting-started/auth-token.mdx index b35141c90..aea872ca7 100644 --- a/src/content/docs/aws/getting-started/auth-token.mdx +++ b/src/content/docs/aws/getting-started/auth-token.mdx @@ -10,10 +10,16 @@ import { Code, Tabs, TabItem } from '@astrojs/starlight/components'; ## Introduction -The Auth Token is required to activate the LocalStack for AWS core cloud emulator. It identifies and authenticates users outside the LocalStack Web Application. -It primarily accesses your workspace and advanced services & features. +The Auth Token activates LocalStack for AWS. It ties the running instance to your workspace and license and is required whenever you use LocalStack for AWS. -Auth tokens come in two types: a **Developer Auth Token** and a **CI Auth Token**: +**Whether you need to configure a token by hand** depends on how you run LocalStack: + +- **[`lstk`](/aws/tooling/lstk)** (early release) — For most local development, the Auth Token is present but easy to overlook. On first run or after `lstk login`, the CLI completes a browser login flow, stores your **Developer Auth Token** in the system keyring (or a config-directory fallback when no keyring is available), and injects it into the container whenever you start LocalStack. You are still using an Auth Token for activation; `lstk` obtains and reuses it after login instead of asking you to set `LOCALSTACK_AUTH_TOKEN` yourself. +- **LocalStack CLI (`localstack`)** — You configure the token yourself: set `LOCALSTACK_AUTH_TOKEN` or run `localstack auth set-token` (see [Configuring your Auth Token](#configuring-your-auth-token)). [`lstk`](/aws/tooling/lstk) is currently in early release and missing some core features, so the `localstack` CLI is still the right tool for Cloud Pods, Extensions, Ephemeral Instances, and other advanced features, so many workflows keep using it and therefore set an Auth Token explicitly. For personal development, use your **Developer Auth Token** from the web app. +- **Docker or Docker Compose** — You pass `LOCALSTACK_AUTH_TOKEN` into the container (see [Configuring your Auth Token](#configuring-your-auth-token)). Use your **Developer Auth Token** for local runs unless you are in CI. +- **CI pipelines and other automated, non-interactive environments** — You must set `LOCALSTACK_AUTH_TOKEN` to a **CI Auth Token**. Developer Auth Tokens should not be used in CI. See [CI Environments](#ci-environments). + +Auth tokens come in two types: a **Developer Auth Token** and a **CI Auth Token**. - The **Developer Auth Token** is linked to a specific user within a specific workspace. Every user has their own Auth Token. @@ -205,25 +211,6 @@ Another way to confirm this is by checking the logs of the LocalStack container Otherwise, check our [troubleshooting](#troubleshooting) section. -## FAQ - -### How do I activate older versions of LocalStack (Before v3.0)? - -Prior to the introduction of Auth Tokens, LocalStack used **API keys** managed through the `LOCALSTACK_API_KEY` environment variable for activation. - -For backwards compatibility, we've updated our back-end to accept new Auth Tokens within the `LOCALSTACK_API_KEY` variable. -You can use the new Auth Token in the same way you previously used the API key. - -### When will the legacy API keys be phased out? - -In early 2025, we will begin phasing out legacy API keys entirely. -After the sunsetting period, legacy API and legacy CI keys will no longer activate or work with LocalStack. - -During the sunsetting period, the legacy service will experience scheduled downtimes. -These are planned to encourage users to transition to new Auth Tokens while minimizing impact for those who have not yet updated. - -The downtime schedule will be communicated well in advance, allowing users ample time to switch to the new Auth Tokens. - ## Troubleshooting While using Auth Tokens, LocalStack demands a successful license activation for startup. From 72d35ca63f433ed4cfee6cab96593dff17bb3665 Mon Sep 17 00:00:00 2001 From: Brian Rinaldi Date: Tue, 28 Apr 2026 17:19:01 -0400 Subject: [PATCH 08/58] Added kubernetes as a secondary path This was per the suggestion of Colin --- src/components/SecondaryPathCard.tsx | 20 ++++++++++++++++ .../docs/aws/getting-started/index.mdx | 11 +++++++++ src/styles/global.css | 24 +++++++++++++++++++ 3 files changed, 55 insertions(+) create mode 100644 src/components/SecondaryPathCard.tsx diff --git a/src/components/SecondaryPathCard.tsx b/src/components/SecondaryPathCard.tsx new file mode 100644 index 000000000..39aaf79c8 --- /dev/null +++ b/src/components/SecondaryPathCard.tsx @@ -0,0 +1,20 @@ +import React from 'react'; + +interface SecondaryPathCardProps { + title: string; + href: string; + children: React.ReactNode; +} + +export const SecondaryPathCard: React.FC = ({ title, href, children }) => { + return ( + + ); +}; diff --git a/src/content/docs/aws/getting-started/index.mdx b/src/content/docs/aws/getting-started/index.mdx index 4b0e25035..a948b454e 100644 --- a/src/content/docs/aws/getting-started/index.mdx +++ b/src/content/docs/aws/getting-started/index.mdx @@ -8,6 +8,7 @@ sidebar: --- import { SectionCards } from '../../../../components/SectionCards.tsx'; +import { SecondaryPathCard } from '../../../../components/SecondaryPathCard.tsx'; [LocalStack for AWS](https://localstack.cloud) is a cloud service emulator that runs in a single container on your laptop or in your CI environment. It gives you a fully functional AWS environment — Lambda, DynamoDB, S3, SQS, and [80+ more services](/aws/services/) — without touching a real AWS account and without incurring cloud costs. @@ -46,3 +47,13 @@ LocalStack for AWS also includes advanced capabilities for teams: [Cloud Pods](/ ]} client:load /> + + + +LocalStack for AWS supports **running inside a Kubernetes cluster** (for example with the Operator or Helm chart), that is an **Enterprise-only** deployment model enabling dynamic scaling, isolation, and native Kubernetes orchestration. + + diff --git a/src/styles/global.css b/src/styles/global.css index c00c4feb1..33e14b98d 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -108,6 +108,30 @@ h3 { transform: translateY(-2px); } +.path-secondary-card { + margin-top: 1rem; +} + +.path-secondary-card .path-secondary-card__title { + font-size: 18px; + font-weight: 500; + letter-spacing: -0.12px; +} + +.path-secondary-card .path-secondary-card__body { + font-size: 16px; + line-height: 26px; + color: var(--sl-color-gray-3); +} + +.path-secondary-card .path-secondary-card__body > :first-child { + margin-top: 0; +} + +.path-secondary-card .path-secondary-card__body > :last-child { + margin-bottom: 0; +} + .service-box-content { height: 100%; display: flex; From bb1cc26f96ef5e223d238399d726d43aace8b455 Mon Sep 17 00:00:00 2001 From: Brian Rinaldi Date: Wed, 29 Apr 2026 07:38:07 -0400 Subject: [PATCH 09/58] Modify to note lstk for CI --- src/content/docs/aws/getting-started/ci-cd.mdx | 16 ++++++++-------- .../docs/aws/getting-started/installation.mdx | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/content/docs/aws/getting-started/ci-cd.mdx b/src/content/docs/aws/getting-started/ci-cd.mdx index 0618d8657..ced79a3e7 100644 --- a/src/content/docs/aws/getting-started/ci-cd.mdx +++ b/src/content/docs/aws/getting-started/ci-cd.mdx @@ -14,7 +14,7 @@ LocalStack works great in CI environments, allowing your integration tests to ru The setup differs slighty from local development in a few important ways: - **Use a CI Auth Token**, not your personal Developer token -- **Manage the container directly** via Docker Compose or `docker run` — `lstk` and the LocalStack Desktop are local-only tools +- **Start LocalStack without a browser** — Docker Compose, `docker run`, or CI helpers such as [`setup-localstack`](https://github.com/localstack/setup-localstack) are common; [`lstk`](/aws/tooling/lstk/) also works in CI when you set `LOCALSTACK_AUTH_TOKEN` and use [`--non-interactive`](/aws/tooling/lstk/#interactive-and-non-interactive-mode) (or rely on automatic non-interactive detection). LocalStack Desktop remains a local-only GUI. - **Runs are often isolated per job** — many pipelines start from an empty LocalStack instance for reproducible tests - **Persistence in CI is supported** — [Cloud Pods](/aws/capabilities/state-management/cloud-pods/), snapshot-based [persistence](/aws/capabilities/state-management/persistence/) with a mounted volume, or `localstack state export` / `localstack state import` with artifacts or cache. @@ -162,13 +162,13 @@ curl -s http://localhost:4566/_localstack/info | jq '.is_license_activated' ## Key differences from local development -| | Local development | CI/CD | -| -------------- | ----------------------------- | ----------------------------------------------------------------------------------- | -| **CLI** | `lstk` or LocalStack CLI | Docker Compose / `docker run` | -| **Auth** | Browser login or stored token | `LOCALSTACK_AUTH_TOKEN` env var | -| **Token type** | Developer token | CI token | -| **State** | Optional persistence | Optional persistence (same mechanisms; typical pattern is a fresh instance per job) | -| **Startup** | Interactive TUI | `--non-interactive` / `-d` flag | +| | Local development | CI/CD | +| -------------- | -------------------------------- | ----------------------------------------------------------------------------------- | +| **CLI** | `lstk` or LocalStack CLI | Docker Compose / `docker run`, or `lstk --non-interactive` | +| **Auth** | Browser login or stored token | `LOCALSTACK_AUTH_TOKEN` env var | +| **Token type** | Developer token | CI token | +| **State** | Optional persistence | Optional persistence (same mechanisms; typical pattern is a fresh instance per job) | +| **Startup** | Interactive TUI (default `lstk`) | Non-interactive (`docker compose`, `docker run -d`, `lstk --non-interactive`) | ## Persisting state across runs diff --git a/src/content/docs/aws/getting-started/installation.mdx b/src/content/docs/aws/getting-started/installation.mdx index d60961891..2fc402009 100644 --- a/src/content/docs/aws/getting-started/installation.mdx +++ b/src/content/docs/aws/getting-started/installation.mdx @@ -278,7 +278,7 @@ If it was installed using the pre-built binary or via Brew, please run the insta ## CI and server environments -For CI pipelines and server deployments, you'll manage the LocalStack container directly rather than using a local CLI. +For CI pipelines and server deployments, use non-interactive startup: Docker Compose or `docker run` are typical, or [`lstk --non-interactive`](/aws/tooling/lstk/#interactive-and-non-interactive-mode) with `LOCALSTACK_AUTH_TOKEN`. See the [CI/CD Setup guide](/aws/getting-started/ci-cd/) for a complete walkthrough including GitHub Actions examples. The options below cover the main container management approaches: From 6ef84e4ab0ac11766e12f866549a8649a242013d Mon Sep 17 00:00:00 2001 From: Quetzalli Date: Thu, 28 May 2026 22:21:32 +0200 Subject: [PATCH 10/58] Update and rename quickstart.mdx to local-development.mdx --- .../getting-started/{quickstart.mdx => local-development.mdx} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/content/docs/aws/getting-started/{quickstart.mdx => local-development.mdx} (98%) diff --git a/src/content/docs/aws/getting-started/quickstart.mdx b/src/content/docs/aws/getting-started/local-development.mdx similarity index 98% rename from src/content/docs/aws/getting-started/quickstart.mdx rename to src/content/docs/aws/getting-started/local-development.mdx index 00f268b73..8855f5903 100644 --- a/src/content/docs/aws/getting-started/quickstart.mdx +++ b/src/content/docs/aws/getting-started/local-development.mdx @@ -10,7 +10,7 @@ import { Tabs, TabItem, Steps } from '@astrojs/starlight/components'; ## Introduction -In this quickstart you'll start LocalStack and deploy a simple serverless API including a Lambda function backed by DynamoDB, entirely on your local machine. +In this guide you'll start LocalStack and deploy a simple serverless API including a Lambda function backed by DynamoDB, entirely on your local machine. No AWS account needed. By the end you will have: From b7ebb19049ccbcf2120470cc4e297daa961045e1 Mon Sep 17 00:00:00 2001 From: Quetzalli Date: Thu, 28 May 2026 22:30:49 +0200 Subject: [PATCH 11/58] Draft 2: rewrite index.mdx --- .../docs/aws/getting-started/index.mdx | 40 ++++++++----------- 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/src/content/docs/aws/getting-started/index.mdx b/src/content/docs/aws/getting-started/index.mdx index a948b454e..a639c333b 100644 --- a/src/content/docs/aws/getting-started/index.mdx +++ b/src/content/docs/aws/getting-started/index.mdx @@ -1,6 +1,6 @@ --- title: Overview -description: This section describes how to get started with LocalStack for AWS using a variety of options, and provides details on how LocalStack can be configured to fit the needs of a local cloud sandbox for development, testing, and experimentation. +description: Introduction to LocalStack for AWS, covering core use cases, local cloud capabilities, and deployment options for development and testing. template: doc editUrl: false sidebar: @@ -8,52 +8,44 @@ sidebar: --- import { SectionCards } from '../../../../components/SectionCards.tsx'; -import { SecondaryPathCard } from '../../../../components/SecondaryPathCard.tsx'; -[LocalStack for AWS](https://localstack.cloud) is a cloud service emulator that runs in a single container on your laptop or in your CI environment. -It gives you a fully functional AWS environment — Lambda, DynamoDB, S3, SQS, and [80+ more services](/aws/services/) — without touching a real AWS account and without incurring cloud costs. +LocalStack provides a cloud service emulator that runs within a single container on your local machine or CI environment. It delivers a functional AWS environment including Lambda, DynamoDB, S3, SQS, and [80+ supported services](/aws/services/), enabling development and testing without an AWS account or cloud-related costs. -Here's why developers and teams use it: +### Core Use Cases -- **Faster development loops** — Test changes against local AWS services instantly, without waiting on real deployments or worrying about cloud costs. -- **Integration testing in CI** — Run real integration tests against local AWS infrastructure in every pull request, catching bugs before they reach production. -- **Validate IaC before applying** — Deploy your Terraform, CDK, or CloudFormation to LocalStack first. Confirm it works the way you expect before applying to a real AWS environment. -- **Safe experimentation** — Explore new AWS services and architectures freely, with no risk to production systems. +- **Accelerate development loops**: Test changes against local AWS services instantly to bypass deployment wait times. +- **Automate integration testing**: Execute integration tests against local AWS infrastructure within pull requests to identify regressions before production. +- **Validate IaC**: Deploy Terraform, CDK, or CloudFormation templates to LocalStack to verify infrastructure logic before applying changes to a cloud environment. +- **Experimental sandbox**: Explore new AWS services and architectures in a risk-free environment. -LocalStack for AWS also includes advanced capabilities for teams: [Cloud Pods](/aws/capabilities/state-management/cloud-pods/) for sharing and restoring state, [IAM policy enforcement](/aws/capabilities/security-testing/iam-policy-enforcement/), [Chaos Engineering](/aws/capabilities/chaos-engineering/), and more. +LocalStack also provides advanced features for team collaboration and security, including [Cloud Pods](/aws/capabilities/state-management/cloud-pods/) for state management, [IAM policy enforcement](/aws/capabilities/security-testing/iam-policy-enforcement/), and [Chaos Engineering](/aws/capabilities/chaos-engineering/). -## Choose your path +## Explore by deployment - - -LocalStack for AWS supports **running inside a Kubernetes cluster** (for example with the Operator or Helm chart), that is an **Enterprise-only** deployment model enabling dynamic scaling, isolation, and native Kubernetes orchestration. - - +:::note +**Enterprise K8 Deployment:** LocalStack also supports execution within Kubernetes clusters via the Operator or Helm charts. This model enables dynamic scaling, environment isolation, and native orchestration. See our [Kubernetes Deployment guide](/aws/enterprise/kubernetes/) for more information. +::: From fb4ec712bd60f1cbfc5f110d85a63aad67ca8a41 Mon Sep 17 00:00:00 2001 From: Quetzalli Date: Thu, 28 May 2026 22:32:39 +0200 Subject: [PATCH 12/58] Delete dead code: src/components/SecondaryPathCard.tsx The reference to the k8 tutorial has been moved into a standard Note component. This file is now dead code. --- src/components/SecondaryPathCard.tsx | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 src/components/SecondaryPathCard.tsx diff --git a/src/components/SecondaryPathCard.tsx b/src/components/SecondaryPathCard.tsx deleted file mode 100644 index 39aaf79c8..000000000 --- a/src/components/SecondaryPathCard.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import React from 'react'; - -interface SecondaryPathCardProps { - title: string; - href: string; - children: React.ReactNode; -} - -export const SecondaryPathCard: React.FC = ({ title, href, children }) => { - return ( - - ); -}; From deede21ff5f8e7ba41ba7c3775ed2ddb42f55b67 Mon Sep 17 00:00:00 2001 From: Quetzalli Date: Thu, 28 May 2026 23:09:22 +0200 Subject: [PATCH 13/58] Draft 2: installation.mdx Removed redundant "Next Steps" clutter and relocated Docker, Compose, and Helm to a dedicated orchestration section. Standardized tone and corrected tool categorizations. --- .../docs/aws/getting-started/installation.mdx | 377 +++--------------- 1 file changed, 66 insertions(+), 311 deletions(-) diff --git a/src/content/docs/aws/getting-started/installation.mdx b/src/content/docs/aws/getting-started/installation.mdx index 2fc402009..8e792ceff 100644 --- a/src/content/docs/aws/getting-started/installation.mdx +++ b/src/content/docs/aws/getting-started/installation.mdx @@ -1,6 +1,6 @@ --- title: Installation -description: All installation methods for LocalStack — lstk, LocalStack CLI, Docker Compose, Docker, and Helm. +description: Installation guides for LocalStack CLIs, container engines, and orchestration tools. template: doc sidebar: order: 2 @@ -9,211 +9,79 @@ sidebar: import { Code, LinkButton, Tabs, TabItem } from '@astrojs/starlight/components'; import { LOCALSTACK_VERSION } from 'astro:env/server'; -## Local development +LocalStack provides multiple installation paths depending on your development environment and requirements. We recommend using a CLI-based installation for the most consistent local development experience. -There are two CLI options for running LocalStack on your laptop. Start with `lstk` if you want the fastest path to a running instance, or use the LocalStack CLI if you need full feature support. +Choose the CLI that fits your workflow: use [`lstk`](#lstk) for a streamlined, non-Python setup, or [LocalStack CLI](#localstack-cli) for access to our complete feature set. -### lstk +## lstk -`lstk` is a lightweight, Go-based CLI that handles the full startup sequence in one command: browser-based login, image pull, and container launch. -It's the fastest way to get LocalStack running locally. +`lstk` is a lightweight, Go-based binary that manages the authentication and container lifecycle in a single workflow. -:::caution[Early release] -`lstk` currently supports core lifecycle commands (`start`, `stop`, `logs`, `status`). -For advanced features like Cloud Pods, Extensions, and Ephemeral Instances, use the [LocalStack CLI](#localstack-cli) instead. -Both tools can coexist on the same system. +:::caution[Early Release] +`lstk` currently supports core lifecycle commands: `start`, `stop`, `logs`, and `status`. For advanced features like Cloud Pods or Extensions, use the [LocalStack CLI](#localstack-cli). ::: -Install `lstk`: +**Install lstk** - - ```bash brew install localstack/tap/lstk ``` + + ```bash + brew install localstack/tap/lstk + ``` + + + ```bash + npm install -g @localstack/lstk + ``` - ```bash npm install -g @localstack/lstk ``` - Download a pre-built binary for your platform from [GitHub - Releases](https://github.com/localstack/lstk/releases) and add it to your - `PATH`. + Download the binary for your platform from the [GitHub Releases](https://github.com/localstack/lstk/releases) and add it to your `PATH`. -Start LocalStack: +**Start LocalStack** ```bash lstk start -``` - -On first run, `lstk` opens a browser login flow. -After authenticating, it pulls the LocalStack image and starts the container. -Subsequent starts use the stored credential from your system keyring — no manual token management needed. - ---- - -### LocalStack CLI - -The full-featured LocalStack CLI gives you access to all LocalStack capabilities. -Please make sure that you have a working [Docker installation](https://docs.docker.com/get-docker/) on your machine before moving on. -### Installing LocalStack CLI - -The CLI starts and manages the LocalStack Docker container. -For alternative methods of managing the LocalStack container, see our [alternative installation instructions](#ci-and-server-environments). - - - - - -You can download the pre-built binary for your architecture using the link below: +``` - - x86-64 - - - ARM64 - +The first execution initiates a browser-based login flow. Subsequent starts use credentials stored in your system keyring. -or use the curl commands below: -For x86-64: +## LocalStack CLI - +The LocalStack CLI is the primary tool for managing all LocalStack capabilities. -For ARM64: +**Requirement:** You must have a working [Docker installation](https://docs.docker.com/get-docker/) before proceeding. - +### Install LocalStack CLI -Then extract the LocalStack CLI from the terminal: +x86-64 +ARM64 - +Extract the binary to `/usr/local/bin`: -
-Alternative: Homebrew on Linux + -If you are using [Homebrew for Linux](https://docs.brew.sh/Homebrew-on-Linux), you can install the LocalStack CLI directly from our official LocalStack tap: ```bash brew install localstack/tap/localstack-cli -``` -
- -
- - - -You can install the LocalStack CLI using Brew directly from our official LocalStack tap: - -```bash -brew install localstack/tap/localstack-cli ``` -
-Alternative: Binary Download - -You may download the binary for your architecture using the link below: - - - Intel (AMD64) - - -or use the following curl command: - - - -Then extract the LocalStack CLI from the terminal: - - - -
-
- - - -You can download the pre-built binary for your architecture using the link below: - - - Intel (AMD64) - - -Then extract the archive and execute the binary in Powershell. - - - - - -If you cannot use the binary releases of LocalStack, you can install the Python distribution. - -Please make sure to install the following before moving ahead: - -- [Python](https://docs.python.org/3/using/index.html) -- [pip](https://pip.pypa.io/en/stable/installation/) - -Next install the LocalStack CLI in your Python environment by running: - ```bash python3 -m pip install --upgrade localstack -``` - -:::note -To download a specific version of LocalStack, replace `` with the required version from [release page](https://github.com/localstack/localstack/releases). -```bash -python3 -m pip install localstack== -``` - -::: - -:::tip[MacOS Sierra?] -If you have problems with permissions in MacOS X Sierra, install with: - -```bash -python3 -m pip install --user localstack ``` -::: - :::danger -Do not use `sudo` or the `root` user when starting LocalStack. -It should be installed and started entirely under a local non-root user. +Do not use `sudo` or the `root` user. Install and execute LocalStack entirely under a local non-root user. ::: - -
-### Starting LocalStack + +### Start LocalStack CLI To verify that the LocalStack CLI was installed correctly, you can check the version in your terminal: @@ -248,7 +116,7 @@ localstack start # start localstack in background with -d flag [12:47:15] detaching bootstrap.py:1262 ``` -### Updating LocalStack CLI +### Update LocalStack CLI The LocalStack CLI allows you to easily update the different components of LocalStack. To check the various options available for updating, run: @@ -276,188 +144,70 @@ Updating the LocalStack CLI using `localstack update localstack-cli` and `locals If it was installed using the pre-built binary or via Brew, please run the installation steps again to update to the latest version. ::: -## CI and server environments - -For CI pipelines and server deployments, use non-interactive startup: Docker Compose or `docker run` are typical, or [`lstk --non-interactive`](/aws/tooling/lstk/#interactive-and-non-interactive-mode) with `LOCALSTACK_AUTH_TOKEN`. -See the [CI/CD Setup guide](/aws/getting-started/ci-cd/) for a complete walkthrough including GitHub Actions examples. - -The options below cover the main container management approaches: -- [Docker Compose](#docker-compose) — recommended for CI and team environments -- [Docker](#docker) — direct container control for scripted setups -- [Helm](#helm) — deploy LocalStack in a Kubernetes cluster +## Container & Orchestration Methods -The LocalStack emulator is available on Docker Hub as `localstack/localstack-pro`. +Use these methods for CI pipelines, server environments, or manual container management. -For a comprehensive overview of LocalStack images, see the [Docker images documentation](/aws/capabilities/config/docker-images). +### Docker Compose -## GUI tools +Recommended for CI and team environments. Create a `docker-compose.yml` with the following configuration: -- [LocalStack Desktop](#localstack-desktop) — desktop UI for managing your local instance -- [LocalStack Docker Extension](#localstack-docker-extension) — manage LocalStack from Docker Desktop - -### LocalStack Desktop - -Learn more about our desktop client at [LocalStack Desktop](/aws/capabilities/web-app/localstack-desktop) and download it [here](https://app.localstack.cloud/download). - -### LocalStack Docker Extension - -Install our [official Docker Desktop extension](https://hub.docker.com/extensions/localstack/localstack-docker-desktop) to manage LocalStack. -See [LocalStack Docker Extension](/aws/tooling/localstack-docker-extension) for more information. - -### Docker-Compose - -To use LocalStack without the [LocalStack CLI](#localstack-cli), you have the option of running the LocalStack Docker container by yourself. -If you want to manually manage your Docker container, it's usually a good idea to use [Docker Compose](https://docs.docker.com/compose/reference/) in order to simplify your container configuration. - -#### Prerequisites - -- [Docker](https://docs.docker.com/get-docker/) -- [Docker Compose](https://docs.docker.com/compose/install/) (version 1.9.0+) - -#### Starting LocalStack with Docker-Compose - -You can start LocalStack with [Docker Compose](https://docs.docker.com/compose/) by configuring a `docker-compose.yml` file. -Docker Compose v1.9.0 and above is supported. - -```yaml showshowLineNumbers +```yaml services: localstack: - container_name: '${LOCALSTACK_DOCKER_NAME:-localstack-main}' - image: localstack/localstack-pro # required for Pro + container_name: "${LOCALSTACK_DOCKER_NAME:-localstack-main}" + image: localstack/localstack-pro ports: - - '127.0.0.1:4566:4566' # LocalStack Gateway - - '127.0.0.1:4510-4559:4510-4559' # external services port range - - '127.0.0.1:443:443' # LocalStack HTTPS Gateway (Pro) + - "127.0.0.1:4566:4566" # Gateway + - "127.0.0.1:4510-4559:4510-4559" # External service range environment: - # Activate LocalStack for AWS: https://docs.localstack.cloud/getting-started/auth-token/ - - LOCALSTACK_AUTH_TOKEN=${LOCALSTACK_AUTH_TOKEN:?} # required for Pro - # LocalStack configuration: https://docs.localstack.cloud/references/configuration/ - - DEBUG=${DEBUG:-0} + - LOCALSTACK_AUTH_TOKEN=${LOCALSTACK_AUTH_TOKEN:?} - PERSISTENCE=${PERSISTENCE:-0} volumes: - - '${LOCALSTACK_VOLUME_DIR:-./volume}:/var/lib/localstack' - - '/var/run/docker.sock:/var/run/docker.sock' -``` - -Start the container by running the following command: + - "${LOCALSTACK_VOLUME_DIR:-./volume}:/var/lib/localstack" + - "/var/run/docker.sock:/var/run/docker.sock" -```bash -docker compose up ``` -:::note - -- This command pulls the current nightly build from the `main` branch (if you don't have the image locally) and **not** the latest supported version. - If you want to use a specific version, set the appropriate LocalStack image tag at `services.localstack.image` in the `docker-compose.yml` file (for example `localstack/localstack:`). - -- If you are using LocalStack with an [Auth Token](/aws/getting-started/auth-token), you need to specify the image tag as `localstack/localstack-pro` in the `docker-compose.yml` file. - Going forward, `localstack/localstack-pro` image will contain our Pro-supported services and APIs. - -- This command reuses the image if it's already on your machine, i.e. it will **not** pull the latest image automatically from Docker Hub. - -- Mounting the Docker socket `/var/run/docker.sock` as a volume is required for some services that use Docker to provide the emulation, such as AWS Lambda. - Check out the [Lambda providers](/aws/services/lambda) documentation for more information. - -- To facilitate interoperability, configuration variables can be prefixed with `LOCALSTACK_` in docker. - For instance, setting `LOCALSTACK_PERSISTENCE=1` is equivalent to `PERSISTENCE=1`. +Execute `docker compose up` to start. -- If using the Docker default bridge network using `network_mode: bridge`, container name resolution will not work inside your containers. - Please consider removing it, if this functionality is needed. +### Docker CLI -- To configure an Auth Token, refer to the [Auth Token](/aws/getting-started/auth-token) documentation. - ::: - -Please note that there are a few pitfalls when configuring your stack manually via docker-compose (e.g., required container name, Docker network, volume mounts, and environment variables). -We recommend using the LocalStack CLI to validate your configuration, which will print warning messages in case it detects any potential misconfigurations: - -```bash -localstack config validate -``` - -### Docker - -You can also directly start the LocalStack container using the Docker CLI instead of [Docker-Compose](#docker-compose). -This method requires more manual steps and configuration, but it gives you more control over the container settings. - -#### Prerequisites - -Please make sure that you have a working [Docker installation](https://docs.docker.com/get-docker/) on your machine before moving on. -You can check if Docker is correctly configured on your machine by executing `docker info` in your terminal. -If it does not report an error (but shows information on your Docker system), you're good to go. - -#### Starting LocalStack with Docker - -You can start the Docker container simply by executing the following `docker run` command: +Run the container directly via the Docker engine: ```bash docker run \ --rm -it \ -p 127.0.0.1:4566:4566 \ -p 127.0.0.1:4510-4559:4510-4559 \ - -p 127.0.0.1:443:443 \ - -e LOCALSTACK_AUTH_TOKEN=${LOCALSTACK_AUTH_TOKEN:?} \ -v /var/run/docker.sock:/var/run/docker.sock \ + -e LOCALSTACK_AUTH_TOKEN=${LOCALSTACK_AUTH_TOKEN:?} \ localstack/localstack-pro -``` - -:::note - -- This command pulls the current nightly build from the `main` branch (if you don't have the image locally) and **not** the latest supported version. - If you want to use a specific version of LocalStack, use the appropriate tag: `docker run --rm -it -p 4566:4566 -p 4510-4559:4510-4559 localstack/localstack:`. - Check-out the [LocalStack releases](https://github.com/localstack/localstack/releases) to know more about specific LocalStack versions. - -- If you are using LocalStack with an [Auth Token](/aws/getting-started/auth-token), you need to specify the image tag as `localstack/localstack-pro` in your Docker setup. - Going forward, `localstack/localstack-pro` image will contain our Pro-supported services and APIs. - -- This command reuses the image if it's already on your machine, i.e. it will **not** pull the latest image automatically from Docker Hub. - -- Mounting the Docker socket `/var/run/docker.sock` as a volume is required for some services that use Docker to provide the emulation, such as AWS Lambda. - Check out the [Lambda providers](/aws/services/lambda) documentation for more information. -- When using Docker to manually start LocalStack, you will have to configure the container on your own (see [docker-compose-pro.yml](https://github.com/localstack/localstack/blob/main/docker-compose-pro.yml) and [Configuration](/aws/capabilities/config/configuration). - This could be seen as the "expert mode" of starting LocalStack. - If you are looking for a simpler method of starting LocalStack, please use the [LocalStack CLI](#localstack-cli). +``` -- To facilitate interoperability, configuration variables can be prefixed with `LOCALSTACK_` in docker. - For instance, setting `LOCALSTACK_PERSISTENCE=1` is equivalent to `PERSISTENCE=1`. +### Helm (Kubernetes) -- To configure an Auth Token, refer to the [Auth Token](/aws/getting-started/auth-token) documentation. - ::: +Deploy LocalStack to a Kubernetes cluster: -### Helm +```bash +helm repo add localstack-repo [https://helm.localstack.cloud](https://helm.localstack.cloud) +helm upgrade --install localstack localstack-repo/localstack -If you want to deploy LocalStack in your [Kubernetes](https://kubernetes.io) cluster, you can use [Helm](https://helm.sh). +``` -#### Prerequisites +## Graphical User Interfaces (GUIs) -- [Kubernetes](https://kubernetes.io) -- [Helm](https://helm.sh/docs/intro/install/) +### LocalStack Desktop -#### Deploy LocalStack using Helm +Manage local instances via a standalone desktop application. [Download here](https://app.localstack.cloud/download). -You can deploy LocalStack in a Kubernetes cluster by running these commands: +### Docker Desktop Extension -```bash -helm repo add localstack-repo https://helm.localstack.cloud -helm upgrade --install localstack localstack-repo/localstack -``` - -The Helm charts are not maintained in the main repository, but in a [separate one](https://github.com/localstack/helm-charts). - -## What's next? +Install the [official extension](https://hub.docker.com/extensions/localstack/localstack-docker-desktop) to manage LocalStack directly from the Docker Desktop dashboard. -Now that you have LocalStack up and running, the following resources might be useful for your next steps: -- Check out our [Quickstart guide](/aws/getting-started/quickstart) if you are a new user to get started with LocalStack quickly. -- [Use the LocalStack integrations](/aws/integrations) to interact with LocalStack and other integrated tools, for example: - - Use `awslocal` to use the AWS CLI against your local cloud! - - Use the Serverless Framework with LocalStack! - - And many more! -- [Find out how to configure LocalStack](/aws/capabilities/config/configuration) such that it perfectly fits your need. -- [Use LocalStack in your CI environment](/aws/integrations/continuous-integration/) to increase your code quality. -- [Checkout LocalStack's Cloud Developer Tools](/aws/tooling/) to further increase your development efficiency with LocalStack. -- Find out about the ways you can [configure LocalStack](/aws/capabilities/config/configuration). ## Troubleshooting @@ -529,3 +279,8 @@ After running the task, run the diagnostic endpoint and share the archive file w We have extensive network troubleshooting documentation available [here](/aws/capabilities/networking/). If this does not solve your problem then please [reach out to LocalStack Support](/aws/help-support/get-help/). + + +## Next steps + +Now that you've completed installation, proceed to the [Local Development Guide](/aws/getting-started/local-development) to start LocalStack and deploy a serverless API. This guide walks you through deploying a Lambda function backed by a DynamoDB table entirely on your local machine. From 525c3fb444311bd0810c2399720d92deffad3654 Mon Sep 17 00:00:00 2001 From: Quetzalli Date: Thu, 28 May 2026 23:44:32 +0200 Subject: [PATCH 14/58] Draft 2: local-development.mdx --- .../aws/getting-started/local-development.mdx | 425 ++++++++---------- 1 file changed, 199 insertions(+), 226 deletions(-) diff --git a/src/content/docs/aws/getting-started/local-development.mdx b/src/content/docs/aws/getting-started/local-development.mdx index 8855f5903..bb8ca588f 100644 --- a/src/content/docs/aws/getting-started/local-development.mdx +++ b/src/content/docs/aws/getting-started/local-development.mdx @@ -1,6 +1,6 @@ --- title: Local Development -description: Deploy a serverless API locally with LocalStack in under 10 minutes using Lambda and DynamoDB. +description: Deploy a serverless application locally using Lambda and DynamoDB on LocalStack. template: doc sidebar: order: 3 @@ -10,70 +10,62 @@ import { Tabs, TabItem, Steps } from '@astrojs/starlight/components'; ## Introduction -In this guide you'll start LocalStack and deploy a simple serverless API including a Lambda function backed by DynamoDB, entirely on your local machine. -No AWS account needed. +This guide walks you through starting LocalStack and deploying a serverless API consisting of a Lambda function and a DynamoDB table. You will perform the entire deployment on your local machine without an AWS account. -By the end you will have: +A successful deployment results in a: +- **LocalStack Container:** Running the core emulation engine. +- **Serverless API:** A Lambda function with a configured Function URL. +- **Persistence Layer:** A DynamoDB table for message storage. +- **Local Cloud Environment:** A functional AWS-emulated sandbox. -- LocalStack running locally in Docker -- A Lambda function deployed and invokable via a public URL -- A DynamoDB table storing data written by the Lambda -- A local environment that behaves like real AWS - -Choose your preferred deployment style below: **AWS CLI** or **Terraform**. +Select your preferred deployment method to begin: **AWS CLI** or **Terraform**. ## Prerequisites -- [Docker](https://docs.docker.com/get-docker/) installed and running -- A [LocalStack account](https://app.localstack.cloud/sign-up) +- [Docker](https://docs.docker.com/get-docker/) engine installed and active. +- A [LocalStack account](https://app.localstack.cloud/sign-up). -## Step 1 — Install and start LocalStack +## Step 1: Install and Start LocalStack -The fastest way to get LocalStack running locally is with `lstk`, a lightweight CLI that handles authentication and image setup automatically. +The `lstk` CLI provides the fastest initialization path by automating authentication and image management. - + Install `lstk`: ```bash - brew install localstack/tap/lstk # macOS / Linux with Homebrew + brew install localstack/tap/lstk ``` - ```bash - npm install -g @localstack/lstk # or via npm - ``` - - Then start LocalStack: + Start LocalStack: ```bash - lstk + lstk start ``` - On first run, `lstk` opens a browser window to authenticate. It also pulls the LocalStack image and starts the container automatically. + The first run triggers a browser-based authentication flow. After authentication, the CLI pulls the LocalStack image and initializes the container. - When the container is ready, you'll see log lines like: + When the container is ready, you will see the following logs: - ```bash + ```text ✔︎ LocalStack ready (containerId: 400b3e61f3c6) • Endpoint: localhost.localstack.cloud:4566 - • Web app: https://app.localstack.cloud - > Tip: View deployed resources: lstk status + • Web app: [https://app.localstack.cloud](https://app.localstack.cloud) ``` - :::note[Early release] - `lstk` currently supports core lifecycle commands (start, stop, logs, status). - For advanced features like Cloud Pods, Extensions, and Ephemeral Instances, use the [LocalStack CLI](/aws/getting-started/installation/#localstack-cli) instead. + :::note[Early Release] + `lstk` currently supports core lifecycle commands (start, stop, logs, status). For advanced features such as Cloud Pods or Extensions, use the [LocalStack CLI](/aws/getting-started/installation/#localstack-cli). ::: - If you prefer the full-featured LocalStack CLI, [install it first](/aws/getting-started/installation/#localstack-cli), then [configure your auth token](/aws/getting-started/auth-token/), and start LocalStack: + If you are using the full-featured LocalStack CLI, ensure you have [configured your auth token](/aws/getting-started/auth-token/) before starting: ```bash localstack start ``` - - When the container is ready, you'll see log lines like: + + When the container is ready, you'll see these log lines: ```bash __ _______ __ __ @@ -95,226 +87,210 @@ The fastest way to get LocalStack running locally is with `lstk`, a lightweight -## Step 2 — Deploy the serverless API +## Step 2: Deploy serverless API -Now deploy a Lambda function and a DynamoDB table. For this tutorial, you can choose between creating resources using the AWS CLI via our `awslocal` wrapper or Terraform via our `tflocal` wrapper. +Deploy the Lambda function and DynamoDB table using either the `awslocal` or `tflocal` wrappers. These tools automatically route commands to your local instance instead of AWS. -1. Install the `awslocal` wrapper if you haven't already: - - ```bash - pip install awscli-local - ``` - -2. Create the Lambda function - - The below code creates a Lambda function using Python and zips the code to be ready for deployment. - - ```bash - mkdir -p /tmp/localstack-demo - cat > /tmp/localstack-demo/handler.py << 'EOF' - import json, boto3, os, uuid - - def handler(event, context): - table = boto3.resource('dynamodb').Table(os.environ['TABLE_NAME']) - method = event.get('requestContext', {}).get('http', {}).get('method', 'GET') - if method == 'POST': - item = {'id': str(uuid.uuid4()), **json.loads(event.get('body', '{}'))} - table.put_item(Item=item) - return {'statusCode': 200, 'body': json.dumps(item)} - result = table.scan() - return {'statusCode': 200, 'body': json.dumps(result['Items'])} - EOF - cd /tmp/localstack-demo && zip handler.zip handler.py - ``` - -3. Create the DynamoDB table - - ```bash - awslocal dynamodb create-table \ - --table-name Messages \ - --attribute-definitions AttributeName=id,AttributeType=S \ - --key-schema AttributeName=id,KeyType=HASH \ - --billing-mode PAY_PER_REQUEST - ``` - -4. Deploy the Lambda - - ```bash - awslocal lambda create-function \ - --function-name messages-api \ - --runtime python3.12 \ - --handler handler.handler \ - --zip-file fileb:///tmp/localstack-demo/handler.zip \ - --role arn:aws:iam::000000000000:role/lambda-role \ - --environment Variables={TABLE_NAME=Messages} - - awslocal lambda wait function-active --function-name messages-api - ``` - -5. Create a public function URL - - ```bash - awslocal lambda create-function-url-config \ - --function-name messages-api \ - --auth-type NONE - ``` - -6. Retrieve the URL - - ```bash - LAMBDA_URL=$(awslocal lambda list-function-url-configs \ - --function-name messages-api \ - --query 'FunctionUrlConfigs[0].FunctionUrl' \ - --output text) - echo $LAMBDA_URL - ``` - - - + 1. Install the `awslocal` wrapper: + + ```bash + pip install awscli-local + ``` + + 2. Create the Lambda function source. + Execute the following to create a project directory and a Python handler: + + ```bash + mkdir -p /tmp/localstack-demo + cat > /tmp/localstack-demo/handler.py << 'EOF' + import json, boto3, os, uuid + + def handler(event, context): + table = boto3.resource('dynamodb').Table(os.environ['TABLE_NAME']) + method = event.get('requestContext', {}).get('http', {}).get('method', 'GET') + if method == 'POST': + item = {'id': str(uuid.uuid4()), **json.loads(event.get('body', '{}'))} + table.put_item(Item=item) + return {'statusCode': 200, 'body': json.dumps(item)} + result = table.scan() + return {'statusCode': 200, 'body': json.dumps(result['Items'])} + EOF + cd /tmp/localstack-demo && zip handler.zip handler.py + ``` + + 3. Create the DynamoDB table: + + ```bash + awslocal dynamodb create-table \ + --table-name Messages \ + --attribute-definitions AttributeName=id,AttributeType=S \ + --key-schema AttributeName=id,KeyType=HASH \ + --billing-mode PAY_PER_REQUEST + ``` + + 4. Deploy the Lambda function: + + ```bash + awslocal lambda create-function \ + --function-name messages-api \ + --runtime python3.12 \ + --handler handler.handler \ + --zip-file fileb:///tmp/localstack-demo/handler.zip \ + --role arn:aws:iam::000000000000:role/lambda-role \ + --environment Variables={TABLE_NAME=Messages} + + awslocal lambda wait function-active --function-name messages-api + ``` + + 5. Configure a public URL and retrieve the endpoint: + + ```bash + awslocal lambda create-function-url-config \ + --function-name messages-api \ + --auth-type NONE + + LAMBDA_URL=$(awslocal lambda list-function-url-configs \ + --function-name messages-api \ + --query 'FunctionUrlConfigs[0].FunctionUrl' \ + --output text) + echo $LAMBDA_URL + ``` + + -1. Install Terraform and the `tflocal` wrapper: - - ```bash - brew install hashicorp/tap/terraform - pip install terraform-local - ``` - - For additional installation options, see the [Terraform installation guide](https://developer.hashicorp.com/terraform/install). - -2. Create a project directory. - - ```bash - mkdir -p /tmp/localstack-demo && cd /tmp/localstack-demo - ``` - - Then create a `main.tf` file with the following content: - - ```hcl - # main.tf - terraform { - required_providers { - aws = { source = "hashicorp/aws" } - archive = { source = "hashicorp/archive" } - } - } - - resource "aws_dynamodb_table" "messages" { - name = "Messages" - billing_mode = "PAY_PER_REQUEST" - hash_key = "id" - attribute { - name = "id" - type = "S" - } - } - - data "archive_file" "lambda" { - type = "zip" - output_path = "${path.module}/handler.zip" - source { - filename = "handler.py" - content = <<-EOF - import json, boto3, os, uuid - def handler(event, context): - table = boto3.resource('dynamodb').Table(os.environ['TABLE_NAME']) - method = event.get('requestContext', {}).get('http', {}).get('method', 'GET') - if method == 'POST': - item = {'id': str(uuid.uuid4()), **json.loads(event.get('body', '{}'))} - table.put_item(Item=item) - return {'statusCode': 200, 'body': json.dumps(item)} - result = table.scan() - return {'statusCode': 200, 'body': json.dumps(result['Items'])} - EOF - } - } - - resource "aws_iam_role" "lambda_role" { - name = "lambda-role" - assume_role_policy = jsonencode({ - Version = "2012-10-17" - Statement = [{ Action = "sts:AssumeRole", Effect = "Allow", - Principal = { Service = "lambda.amazonaws.com" } }] - }) - } - - resource "aws_lambda_function" "messages_api" { - function_name = "messages-api" - runtime = "python3.12" - handler = "handler.handler" - filename = data.archive_file.lambda.output_path - source_code_hash = data.archive_file.lambda.output_base64sha256 - role = aws_iam_role.lambda_role.arn - environment { - variables = { TABLE_NAME = aws_dynamodb_table.messages.name } - } - } - - resource "aws_lambda_function_url" "messages_api" { - function_name = aws_lambda_function.messages_api.function_name - authorization_type = "NONE" - } - - output "function_url" { - value = aws_lambda_function_url.messages_api.function_url - } - ``` - -3. Deploy - - ```bash - tflocal init - tflocal apply -auto-approve - ``` - -4. Retrieve the URL - - ```bash - LAMBDA_URL=$(tflocal output -raw function_url) - echo $LAMBDA_URL - ``` - - + 1. Install Terraform and the `tflocal` wrapper: + + ```bash + pip install terraform-local + ``` + + 2. Create a `main.tf` file in a new directory: + + ```hcl + terraform { + required_providers { + aws = { source = "hashicorp/aws" } + archive = { source = "hashicorp/archive" } + } + } + + resource "aws_dynamodb_table" "messages" { + name = "Messages" + billing_mode = "PAY_PER_REQUEST" + hash_key = "id" + attribute { + name = "id" + type = "S" + } + } + + data "archive_file" "lambda" { + type = "zip" + output_path = "${path.module}/handler.zip" + source { + filename = "handler.py" + content = <<-EOF + import json, boto3, os, uuid + def handler(event, context): + table = boto3.resource('dynamodb').Table(os.environ['TABLE_NAME']) + method = event.get('requestContext', {}).get('http', {}).get('method', 'GET') + if method == 'POST': + item = {'id': str(uuid.uuid4()), **json.loads(event.get('body', '{}'))} + table.put_item(Item=item) + return {'statusCode': 200, 'body': json.dumps(item)} + result = table.scan() + return {'statusCode': 200, 'body': json.dumps(result['Items'])} + EOF + } + } + + resource "aws_iam_role" "lambda_role" { + name = "lambda-role" + assume_role_policy = jsonencode({ + Version = "2012-10-17" + Statement = [{ Action = "sts:AssumeRole", Effect = "Allow", + Principal = { Service = "lambda.amazonaws.com" } }] + }) + } + + resource "aws_lambda_function" "messages_api" { + function_name = "messages-api" + runtime = "python3.12" + handler = "handler.handler" + filename = data.archive_file.lambda.output_path + source_code_hash = data.archive_file.lambda.output_base64sha256 + role = aws_iam_role.lambda_role.arn + environment { + variables = { TABLE_NAME = aws_dynamodb_table.messages.name } + } + } + + resource "aws_lambda_function_url" "messages_api" { + function_name = aws_lambda_function.messages_api.function_name + authorization_type = "NONE" + } + + output "function_url" { + value = aws_lambda_function_url.messages_api.function_url + } + ``` + + 3. Initialize and apply the configuration: + + ```bash + tflocal init && tflocal apply -auto-approve + ``` + + 4. Retrieve the endpoint: + + ```bash + LAMBDA_URL=$(tflocal output -raw function_url) + echo $LAMBDA_URL + ``` + -## Step 3 — Test the API +## Step 3: Test the API -Store a message: +Send a POST request to store a message in the emulated DynamoDB table: ```bash curl -X POST "$LAMBDA_URL" \ -H "Content-Type: application/json" \ -d '{"message": "Hello, LocalStack!"}' + ``` -You should get back a response like: +You will get back a response: ```json { "id": "a1b2c3d4-...", "message": "Hello, LocalStack!" } ``` -List all messages: +Retrieve all your messages: ```bash curl "$LAMBDA_URL" + ``` -**That's the win.** You just invoked a real Lambda function that wrote to a real DynamoDB table — all running locally, with no AWS account and no cloud costs. +The Lambda function executes within the local environment and interacts with the emulated DynamoDB service. Because no actual cloud resources are created, you won't incur any cloud costs or infrastructure changes. -## Step 4 — Inspect your resources +## Step 4: Inspect Resources -You can browse the resources you just deployed in the [LocalStack Web Application](https://app.localstack.cloud/). -Navigate to your [Default Instance](https://app.localstack.cloud/inst/default/status) and click through to [Lambda](https://app.localstack.cloud/inst/default/resources/lambda/functions) or [DynamoDB](https://app.localstack.cloud/inst/default/resources/dynamodb) to see your running infrastructure. +View the state of your local infrastructure via the [LocalStack Web Application](https://app.localstack.cloud/). +Navigate to the [Resource Browser](https://app.localstack.cloud/inst/default/status) to inspect your Lambda functions and DynamoDB tables in real-time. -## Step 5 — Clean up +## Step 5: Clean Up -First, stop LocalStack to tear down all local resources: +Stop your LocalStack container to remove all emulated resources. LocalStack is ephemeral by default; stopping the instance clears the state. {/* prettier-ignore-start */} @@ -324,19 +300,16 @@ First, stop LocalStack to tear down all local resources: {/* prettier-ignore-end */} -LocalStack is ephemeral by default — stopping it removes all provisioned resources. To persist state across restarts, see [Persistence](/aws/capabilities/state-management/persistence/) or [Cloud Pods](/aws/capabilities/state-management/cloud-pods/). -Now that you're done, you can remove the tutorial files from your machine (the Lambda source, zip, and, if you used Terraform, `main.tf` and state under the same folder): +Remove the local files you created in this guide: ```bash rm -rf /tmp/localstack-demo + ``` ## Next steps -- [Tutorials](/aws/tutorials/) — Deeper dives into specific AWS services and application stacks -- [Supported Services](/aws/services/) — Full list of emulated AWS services -- [CI/CD Setup](/aws/getting-started/ci-cd/) — Run LocalStack in GitHub Actions and other pipelines -- [AI & Agent Workflows](/aws/getting-started/ai-workflows/) — Use LocalStack with AI coding tools and agents -- [Tooling](/aws/tooling/) — `awslocal`, `tflocal`, LocalStack Desktop, and more +You have successfully deployed and tested a serverless API on your local workstation. Proceed to the [CI/CD guide](/aws/getting-started/ci-cd/) to learn how to integrate LocalStack into your automated testing pipelines and GitHub Actions workflows. + From 9ebdb73e046fadf765ce9bf3e9f597a49cc52313 Mon Sep 17 00:00:00 2001 From: Quetzalli Date: Fri, 29 May 2026 00:09:17 +0200 Subject: [PATCH 15/58] Draft 2: Rewrite ci-cd.mdx --- .../docs/aws/getting-started/ci-cd.mdx | 148 +++++++----------- 1 file changed, 53 insertions(+), 95 deletions(-) diff --git a/src/content/docs/aws/getting-started/ci-cd.mdx b/src/content/docs/aws/getting-started/ci-cd.mdx index ced79a3e7..fb7ac2f10 100644 --- a/src/content/docs/aws/getting-started/ci-cd.mdx +++ b/src/content/docs/aws/getting-started/ci-cd.mdx @@ -1,6 +1,6 @@ --- -title: CI/CD -description: Run LocalStack in CI pipelines — auth tokens, Docker Compose, GitHub Actions examples, and persisting state with Cloud Pods or state export. +title: CI/CD Integration +description: implementation guides for LocalStack in automated pipelines, including GitHub Actions, Docker Compose, and state management. template: doc sidebar: order: 4 @@ -8,42 +8,43 @@ sidebar: import { Tabs, TabItem } from '@astrojs/starlight/components'; -## Overview +Integrating LocalStack into CI/CD environments enables automated integration testing without cloud infrastructure costs or vendor dependency. CI configurations differ from local development environments in authentication methods and startup workflows. -LocalStack works great in CI environments, allowing your integration tests to run incredibly fast and with no cloud costs. -The setup differs slighty from local development in a few important ways: +Key operational differences in CI/CD include: +- **Authentication**: Use a dedicated CI Auth Token instead of a personal Developer token. +- **Initialization**: Execute LocalStack in non-interactive mode using Docker Compose, the Docker CLI, or specialized CI actions. +- **Isolation**: Initialize a fresh LocalStack instance for each job to ensure reproducible test results. +- **State Management**: Utilize Cloud Pods or state export/import commands to persist infrastructure across pipeline stages. -- **Use a CI Auth Token**, not your personal Developer token -- **Start LocalStack without a browser** — Docker Compose, `docker run`, or CI helpers such as [`setup-localstack`](https://github.com/localstack/setup-localstack) are common; [`lstk`](/aws/tooling/lstk/) also works in CI when you set `LOCALSTACK_AUTH_TOKEN` and use [`--non-interactive`](/aws/tooling/lstk/#interactive-and-non-interactive-mode) (or rely on automatic non-interactive detection). LocalStack Desktop remains a local-only GUI. -- **Runs are often isolated per job** — many pipelines start from an empty LocalStack instance for reproducible tests -- **Persistence in CI is supported** — [Cloud Pods](/aws/capabilities/state-management/cloud-pods/), snapshot-based [persistence](/aws/capabilities/state-management/persistence/) with a mounted volume, or `localstack state export` / `localstack state import` with artifacts or cache. +## Step 1: Configure CI Auth Token -## Step 1 — Get a CI Auth Token +Dedicated CI Auth Tokens are required for automated environments to ensure security and auditability. -CI pipelines should use a dedicated CI Auth Token, not a developer token tied to a specific user. +1. Navigate to the [Auth Tokens page](https://app.localstack.cloud/workspace/auth-tokens) in the LocalStack Web Application. +2. Generate a new **CI Auth Token**. +3. Store the token as a protected secret within your CI provider (e.g., `LOCALSTACK_AUTH_TOKEN`). -1. Go to the [Auth Tokens page](https://app.localstack.cloud/workspace/auth-tokens) in the LocalStack Web Application -2. Create a new **CI Auth Token** -3. Add it as a secret in your CI provider (e.g., `LOCALSTACK_AUTH_TOKEN`) +:::danger[Security Best Practice] +Never commit your auth tokens to source control. +Always inject tokens via your CI provider's secrets or environment variable system. +Rotate compromised tokens immediately via the Web Application. Old tokens are invalidated instantly. +::: -:::danger[Keep your token secret] -Never commit an auth token to source control. -Always inject it via your CI provider's secrets or environment variable mechanism. -If a token is compromised, rotate it immediately on the Auth Tokens page — old tokens are invalidated instantly. +:::note +Read the [Auth Token guide](/aws/getting-started/auth-token/) for full details on token types and configuration. ::: -See the [Auth Token documentation](/aws/getting-started/auth-token/) for full details on token types and configuration. +## Step 2: Start LocalStack in CI -## Step 2 — Start LocalStack in CI +Select the integration method compatible with your CI runner architecture. - The recommended approach is to start LocalStack as a service container or as a step using the official GitHub Action: + Use the official GitHub Action to initialize LocalStack as a workflow step: ```yaml # .github/workflows/integration-tests.yml name: Integration Tests - on: [push, pull_request] jobs: @@ -62,17 +63,18 @@ See the [Auth Token documentation](/aws/getting-started/auth-token/) for full de - name: Run tests run: | - # Your test commands here, e.g.: + # Your test commands here, e.g.: pip install awscli-local - awslocal s3 mb s3://my-test-bucket + awslocal s3 mb s3://integration-test-bucket pytest tests/integration/ ``` + + + The `setup-localstack` action pulls the image, starts the container, and waits for LocalStack to be ready. - The `setup-localstack` action handles pulling the image, starting the container, and waiting for LocalStack to be ready. - - Add LocalStack as a service in your `docker-compose.yml`: + Define LocalStack as a service in your `docker-compose.yml` for containerized environments: ```yaml services: @@ -82,16 +84,13 @@ See the [Auth Token documentation](/aws/getting-started/auth-token/) for full de ports: - "127.0.0.1:4566:4566" - "127.0.0.1:4510-4559:4510-4559" - - "127.0.0.1:443:443" environment: - LOCALSTACK_AUTH_TOKEN=${LOCALSTACK_AUTH_TOKEN:?} - - DEBUG=${DEBUG:-0} volumes: - - "${LOCALSTACK_VOLUME_DIR:-./volume}:/var/lib/localstack" - "/var/run/docker.sock:/var/run/docker.sock" ``` - Start it and wait for readiness: + Start the service and verify readiness before executing tests: ```bash docker compose up -d localstack @@ -104,8 +103,9 @@ See the [Auth Token documentation](/aws/getting-started/auth-token/) for full de ::: - - Start LocalStack directly with `docker run`: + + + Initialize the container directly using the Docker engine: ```bash docker run \ @@ -120,76 +120,34 @@ See the [Auth Token documentation](/aws/getting-started/auth-token/) for full de # Wait for readiness until curl -s http://localhost:4566/_localstack/health | grep -q '"running"'; do sleep 1; done ``` - - - - Add LocalStack as a service in your CircleCI config: - - ```yaml - version: 2.1 - - jobs: - integration-tests: - docker: - - image: cimg/python:3.12 - - image: localstack/localstack-pro - environment: - LOCALSTACK_AUTH_TOKEN: $LOCALSTACK_AUTH_TOKEN - steps: - - checkout - - run: - name: Wait for LocalStack - command: | - until curl -s http://localhost:4566/_localstack/health | grep -q '"running"'; do sleep 1; done - - run: - name: Run tests - command: pytest tests/integration/ - ``` - - Set `LOCALSTACK_AUTH_TOKEN` in your CircleCI project's environment variables. - -## Verify activation - -After LocalStack starts, confirm the license is active: - -```bash -curl -s http://localhost:4566/_localstack/info | jq '.is_license_activated' -# Should return: true -``` - -## Key differences from local development - -| | Local development | CI/CD | -| -------------- | -------------------------------- | ----------------------------------------------------------------------------------- | -| **CLI** | `lstk` or LocalStack CLI | Docker Compose / `docker run`, or `lstk --non-interactive` | -| **Auth** | Browser login or stored token | `LOCALSTACK_AUTH_TOKEN` env var | -| **Token type** | Developer token | CI token | -| **State** | Optional persistence | Optional persistence (same mechanisms; typical pattern is a fresh instance per job) | -| **Startup** | Interactive TUI (default `lstk`) | Non-interactive (`docker compose`, `docker run -d`, `lstk --non-interactive`) | +## Technical Comparison: Local vs. CI/CD -## Persisting state across runs +| Feature | Local Development | CI/CD Environment | +| :--- | :--- | :--- | +| **Interface** | `lstk` or LocalStack CLI | Docker Compose / `docker run`, or `lstk --non-interactive` | +| **Authentication** | Browser-based or stored credentials | `LOCALSTACK_AUTH_TOKEN` environment variable | +| **Token Type** | Individual Developer Token | Dedicated CI Token | +| **State** | Persistent by choice | Ephemeral (standard) or Snapshotted (Cloud Pods) | +| **Startup Mode** | Interactive (TUI) (default `lstk`) | Non-interactive (Headless) (`docker compose`, `docker run -d`, `lstk --non-interactive`) | -If you tear down the container at the end of a job, nothing is left on disk unless you save it — which is why many teams use a clean instance every time. -When you **do** need to reuse infrastructure or data between pipeline runs or steps, CI is fully supported: +## State Persistence in CI -- **[Cloud Pods](/aws/capabilities/state-management/cloud-pods/)** — save and load snapshots; the [`setup-localstack`](https://github.com/localstack/setup-localstack) action can load and save pods via `state-backend: cloud-pods` (see [GitHub Actions](/aws/integrations/continuous-integration/github-actions/) — _Store Localstack state_). -- **Snapshot-based [persistence](/aws/capabilities/state-management/persistence/)** — enable `PERSISTENCE=1` and mount a volume so state survives container restarts on the same runner or workspace. -- **State export/import** — run `localstack state export` and `localstack state import` and pass the file through your CI provider’s **artifacts**, **cache**, or attached storage (for example, see [GitLab CI](/aws/integrations/continuous-integration/gitlab-ci/) — _Store Localstack state_). +While most pipelines favor ephemeral instances for clean test cycles, certain workflows require persisting infrastructure state across jobs or runners. -Choose the approach that fits your runner model: for example, multi-job GitLab pipelines often need explicit state handoff because services do not carry between jobs. +- **[Cloud Pods](/aws/capabilities/state-management/cloud-pods/)**: Save or load snapshots using the `setup-localstack` action with the `state-backend: cloud-pods` configuration. +- **Snapshot Persistence Engine**: Enable `PERSISTENCE=1` and mount a host volume to retain data across container restarts on the same runner. +- **State Export/Import Commands**: Use `localstack state export` and `localstack state import` to pass infrastructure state via CI artifacts or caching mechanisms. -## More CI integrations +## Next steps -LocalStack has dedicated integration guides for many CI providers: +You have configured LocalStack for automated environments and explored various CI/CD integration patterns. Proceed to the [AI & Agent Workflows Guide](/aws/getting-started/ai-workflows/) to learn how to integrate LocalStack with AI coding assistants and automate infrastructure tasks. -- [GitHub Actions](/aws/integrations/continuous-integration/github-actions/) -- [GitLab CI](/aws/integrations/continuous-integration/gitlab-ci/) -- [CircleCI](/aws/integrations/continuous-integration/circleci/) -- [AWS CodeBuild](/aws/integrations/continuous-integration/codebuild/) -- [Travis CI](/aws/integrations/continuous-integration/travis-ci/) -- [Bitbucket Pipelines](/aws/integrations/continuous-integration/bitbucket/) +## Resources -See the full [CI/CD integrations](/aws/integrations/continuous-integration/) section for details. +- [GitHub Actions Integration](/aws/integrations/continuous-integration/github-actions/): Advanced workflows and configuration options. +- [CircleCI Guide](/aws/integrations/continuous-integration/circleci/): Implementation details for CircleCI environments. +- [GitLab CI Integration](/aws/integrations/continuous-integration/gitlab-ci/): Service-based setup for GitLab runners. +- [AWS CodeBuild](/aws/integrations/continuous-integration/codebuild/): Native AWS CI/CD integration. From 4ca4a39f2873dffb0751f0bb6f16735c4dac290c Mon Sep 17 00:00:00 2001 From: Quetzalli Date: Fri, 29 May 2026 00:32:57 +0200 Subject: [PATCH 16/58] Draft 2: rewrite ai-workflows.mdx Consolidated use cases, removed duplicated MCP configuration, and deleted non-functional validation content. Standardized the tone and improved technical context throughout the guide. --- .../docs/aws/getting-started/ai-workflows.mdx | 94 +++++-------------- 1 file changed, 21 insertions(+), 73 deletions(-) diff --git a/src/content/docs/aws/getting-started/ai-workflows.mdx b/src/content/docs/aws/getting-started/ai-workflows.mdx index 51efca9d4..2427ddbbe 100644 --- a/src/content/docs/aws/getting-started/ai-workflows.mdx +++ b/src/content/docs/aws/getting-started/ai-workflows.mdx @@ -1,95 +1,43 @@ --- title: AI & Agent Workflows -description: Use LocalStack with AI coding assistants, MCP servers, and agent-driven infrastructure automation. +description: Integrate LocalStack with AI coding assistants, MCP servers, and agent-driven infrastructure automation. template: doc sidebar: order: 5 --- -## Overview +LocalStack provides a secure, emulated environment for developing and testing AI-assisted workflows. You can iterate on AI-generated infrastructure code and agentic deployment tasks without incurring cloud costs or risking production AWS environments by using a local cloud sandbox. -AI-assisted development workflows need a fast and secure environment to develop and test in. -Whether you're using an AI coding assistant to generate infrastructure code, running an agent that deploys AWS resources, or validating AI-generated IaC before applying it to real AWS — LocalStack gives you a safe, fast, cost-free environment to run these workflows in. +## Capability Map -## Connect an AI coding assistant via MCP +| Use Case | Recommended Tooling | +| :--- | :--- | +| **AI Assistant Resource Management** | [LocalStack MCP Server](/aws/tooling/mcp-server/) | +| **Autonomous Infrastructure Deployment** | [LocalStack Skills](https://github.com/localstack/skills) | +| **Local IaC Validation** | LocalStack + `tflocal` / `cdklocal` / `awslocal` | -The [LocalStack MCP Server](https://github.com/localstack/localstack-mcp-server) is a [Model Context Protocol](https://modelcontextprotocol.io/) (MCP) server that connects compatible clients (Claude, Cursor, Windsurf, and others) to your LocalStack environment. -It gives agents tools to run the full local cloud lifecycle—not only generating infrastructure code, but starting the container, deploying and tearing down IaC, analyzing logs, and more. -See [Introducing the LocalStack MCP Server](https://blog.localstack.cloud/introducing-localstack-mcp-server/) for the original announcement and walkthrough. -With the MCP server configured, your assistant can use tools such as: +## Model Context Protocol (MCP) Integration -- **Lifecycle** — Start, stop, restart, or check status of the LocalStack container -- **Deploy** — Deploy or destroy CDK, Terraform, SAM, or CloudFormation projects on LocalStack -- **Operations** — Analyze logs, run AWS CLI commands via `awslocal`, manage [Cloud Pods](/aws/capabilities/state-management/cloud-pods/), and (where supported) IAM policy analysis, chaos injection, and docs search +The LocalStack MCP Server connects compatible AI clients (such as Claude, Cursor, or Windsurf) to your local cloud environment. This integration allows AI agents to manage the full local cloud lifecycle, including container management, resource deployment, and log analysis. -...and many more. - -### MCP Server Prerequisites - -Before you begin, make sure these are installed and in your system's `PATH`: - -- [Node.js](https://nodejs.org/en/) (v20.x or later) to run the `npx` command. -- [LocalStack CLI](https://docs.localstack.cloud/user-guide/cli/) and [Docker](https://docs.docker.com/get-docker/) to manage the LocalStack container itself. -- [`cdklocal`](https://docs.localstack.cloud/user-guide/integrations/aws-cdk/) or [`tflocal`](https://docs.localstack.cloud/user-guide/integrations/terraform/) to use the `localstack-deployer` tool. (optional) -- A [LocalStack Auth Token](https://docs.localstack.cloud/getting-started/auth-token/) to enable licensed features. (optional) - -### MCP Server Configuration - -Add a server entry like this to your client's MCP configuration—for **Cursor**, this would typically be `~/.cursor/mcp.json`. -For **Claude Code**, register the server with `claude mcp add` (it is saved to your project-level MCP configuration). - -```json -{ - "mcpServers": { - "localstack-mcp-server": { - "command": "npx", - "args": ["-y", "@localstack/localstack-mcp-server"], - "env": { - "LOCALSTACK_AUTH_TOKEN": "" - } - } - } -} -``` - -Full prerequisites, Cursor/VS Code/Claude Code variants, custom endpoints (`LOCALSTACK_HOSTNAME`, `LOCALSTACK_PORT`), troubleshooting, and the complete tool reference are on [LocalStack MCP Server](/aws/tooling/mcp-server/). - -:::note -You do not need to start LocalStack manually before using MCP: an agent can start the container using the **localstack-management** tool once this configuration is in place. -If LocalStack already runs elsewhere, point the MCP server at it via the `env` block as described in [Connecting to a custom LocalStack endpoint](/aws/tooling/mcp-server/#connecting-to-a-custom-localstack-endpoint). +:::note[Official MCP Documentation] +For detailed configuration instructions, prerequisite checks, and the complete tool reference, read our [LocalStack MCP Server guide](https://docs.localstack.cloud/aws/tooling/mcp-server/). You don't need to start LocalStack manually before using MCP; agents can initialize the container using the management tools provided by the server. ::: -## Deploy with agent-driven automation using Skills - -[LocalStack Skills](https://github.com/localstack/skills) are pre-built agent skill definitions for deploying common AWS architectures locally. It contains skills for LocalStack lifecycle management, IaC deployment, state management and more. Skills can be used in combination with the MCP server to create a fully autonomous agent-driven workflow. - -Skills are useful when: - -- You want to scaffold a new local environment quickly without writing all the infrastructure code yourself -- You're using an agent-first workflow and want LocalStack to be a first-class deployment target -- You want to iterate rapidly on architecture without touching real AWS - -Browse the [skills repository](https://github.com/localstack/skills) for available skills and setup instructions. -## Validate AI-generated IaC before applying to AWS +## Agent-Driven Automation with Skills -A common pattern when using AI to generate Terraform, CDK, or CloudFormation is to deploy it to LocalStack first. -This catches configuration errors, missing permissions, and service interaction bugs before you spend time (and money) deploying to real AWS. +[LocalStack Skills](https://github.com/localstack/skills) provide pre-defined agent skill definitions for automating AWS architecture deployments. These skills allow agents to scaffold environments, iterate on architecture designs, and manage LocalStack state autonomously. -The workflow is: +Skills implementation scenarios: +- **Rapid Prototyping**: Scaffold new local environments without manual infrastructure coding. +- **Agent-First Development**: Establish LocalStack as a primary deployment target for autonomous agents. +- **Architecture Iteration**: Test complex architectural changes in a risk-free, local sandbox. -1. Generate infrastructure code with your AI tool -2. Deploy to LocalStack with `tflocal apply` (Terraform), `cdklocal deploy` (CDK), or the AWS CLI -3. Run your integration tests against the local environment -4. When everything passes, deploy to real AWS with confidence +Refer to the [LocalStack Skills repository](https://github.com/localstack/skills) for available skill definitions and setup instructions. -See [Tooling](/aws/tooling/) for the full list of LocalStack-aware wrappers for common IaC tools. -## Summary +## Next steps -| Use case | Tool | -| ------------------------------------------------------ | --------------------------------------------------------- | -| AI assistant that can inspect & manage local resources | [LocalStack MCP Server](/aws/tooling/mcp-server/) | -| Agent-driven infrastructure deployment | [LocalStack Skills](https://github.com/localstack/skills) | -| Validate AI-generated IaC safely | LocalStack + `tflocal` / `cdklocal` / `awslocal` | +You have explored the integration patterns for AI and agent-driven development. Proceed to the [Auth Token guide](/aws/getting-started/auth-token/) to configure your licensing and unlock advanced LocalStack features. From 5bfe4a9a7f934d9d7f868e8501fec881a8be08ea Mon Sep 17 00:00:00 2001 From: Quetzalli Date: Fri, 29 May 2026 00:43:36 +0200 Subject: [PATCH 17/58] Draft 2: rewrite auth-token.mdx Eliminated redundant introduction slop and consolidated configuration methods by execution type. Simplified token comparisons, optimized verification snippets, and unified security warnings for better technical clarity. --- .../docs/aws/getting-started/auth-token.mdx | 262 ++++-------------- 1 file changed, 50 insertions(+), 212 deletions(-) diff --git a/src/content/docs/aws/getting-started/auth-token.mdx b/src/content/docs/aws/getting-started/auth-token.mdx index aea872ca7..500812095 100644 --- a/src/content/docs/aws/getting-started/auth-token.mdx +++ b/src/content/docs/aws/getting-started/auth-token.mdx @@ -1,6 +1,6 @@ --- title: Auth Token -description: Configure your Auth Token to access and activate LocalStack. +description: Configure and manage LocalStack Auth Tokens for local development and CI/CD environments. template: doc sidebar: order: 6 @@ -8,256 +8,94 @@ sidebar: import { Code, Tabs, TabItem } from '@astrojs/starlight/components'; -## Introduction +The Auth Token is a mandatory credential required to pull the `localstack-pro` image and activate service entitlements. It links your local instance to your workspace license and enables access to the full suite of emulated AWS services. -The Auth Token activates LocalStack for AWS. It ties the running instance to your workspace and license and is required whenever you use LocalStack for AWS. +## Token Types -**Whether you need to configure a token by hand** depends on how you run LocalStack: +| Token Type | Scope | Use Case | +| :--- | :--- | :--- | +| **Developer Token** | Individual | Local development workstations. Managed per user. | +| **CI Auth Token** | Workspace | Automated pipelines and shared runners. Managed by workspace admins. | -- **[`lstk`](/aws/tooling/lstk)** (early release) — For most local development, the Auth Token is present but easy to overlook. On first run or after `lstk login`, the CLI completes a browser login flow, stores your **Developer Auth Token** in the system keyring (or a config-directory fallback when no keyring is available), and injects it into the container whenever you start LocalStack. You are still using an Auth Token for activation; `lstk` obtains and reuses it after login instead of asking you to set `LOCALSTACK_AUTH_TOKEN` yourself. -- **LocalStack CLI (`localstack`)** — You configure the token yourself: set `LOCALSTACK_AUTH_TOKEN` or run `localstack auth set-token` (see [Configuring your Auth Token](#configuring-your-auth-token)). [`lstk`](/aws/tooling/lstk) is currently in early release and missing some core features, so the `localstack` CLI is still the right tool for Cloud Pods, Extensions, Ephemeral Instances, and other advanced features, so many workflows keep using it and therefore set an Auth Token explicitly. For personal development, use your **Developer Auth Token** from the web app. -- **Docker or Docker Compose** — You pass `LOCALSTACK_AUTH_TOKEN` into the container (see [Configuring your Auth Token](#configuring-your-auth-token)). Use your **Developer Auth Token** for local runs unless you are in CI. -- **CI pipelines and other automated, non-interactive environments** — You must set `LOCALSTACK_AUTH_TOKEN` to a **CI Auth Token**. Developer Auth Tokens should not be used in CI. See [CI Environments](#ci-environments). +Manage both token types on the [Auth Tokens page](https://app.localstack.cloud/workspace/auth-tokens) in the LocalStack Web Application. -Auth tokens come in two types: a **Developer Auth Token** and a **CI Auth Token**. - -- The **Developer Auth Token** is linked to a specific user within a specific workspace. - Every user has their own Auth Token. - It cannot be deleted but can be rotated for security reasons if needed. -- The **CI Auth Token** is not associated with any specific user and is designed for use in CI environments and other non-developer contexts. - These tokens are stored in the workspace and can be managed by members with appropriate permissions. - -Both the **Developer Auth Token** and **CI Auth Token** can be managed on the [Auth Tokens page](https://app.localstack.cloud/workspace/auth-tokens). - -:::danger - -- It's crucial to keep your Auth Token confidential. - Do not include it in source code management systems, such as Git repositories. -- Be aware that if an Auth Token is committed to a public repository, it is at risk of exposure, and could remain in the repository's history, even if attempts are made to rewrite it. -- In case your Auth Token is accidentally published, immediately rotate it on the [Auth Token page](https://app.localstack.cloud/workspace/auth-tokens). - ::: - -## Managing your License - -To use LocalStack, a license is required. -You can get a license by registering on the [LocalStack Web Application](https://app.localstack.cloud/sign-up). -Choose between a 14-day trial or explore additional features with our paid offering. -During the trial period, you are welcome to use all the features of LocalStack. - -After initiating your trial or acquiring a license, proceed to assign it to a user by following the steps outlined below: - -- Visit the [Users & Licenses page](https://app.localstack.cloud/workspace/members). -- Select a user in the **Workspace Members** section for license assignment. -- Define user's role via the **Member Role** dropdown. - Single users automatically receive the **Admin** role. -- Toggle **Advanced Permissions** to set specific permissions. - Single users automatically receive full permissions. -- Click **Save** to complete the assignment. - Single users assign licenses to themselves. - -![Assigning a license](/images/aws/assigning-a-license.png) - -If you have joined a workspace, you need to be assigned a license by the workspace administrator. -In case of switching workspaces or licenses, you need to make sure that you are assigned to the correct license. - -:::note -If you do not assign a license, you will not be able to use LocalStack even if you have a valid Auth token. +:::danger[Credential Security] +Auth Tokens provide full access to your license and workspace. **Do not commit tokens to version control.** If a token is exposed, rotate it immediately via the Web Application to invalidate existing sessions. ::: -To view your own assigned license, visit the [My License page](https://app.localstack.cloud/workspace/my-license). -You can further navigate to the [Auth Token page](https://app.localstack.cloud/workspace/auth-tokens) to view your **Developer Auth Token** and **CI Auth Token**. - -## Configuring your Auth Token - -LocalStack requires the `LOCALSTACK_AUTH_TOKEN` environment variable to contain your Auth Token. -You can configure your Auth Token in several ways, depending on your use case. -The following sections describe the various methods of setting your Auth Token. - -:::danger - -- It's crucial to keep your Auth Token confidential. - Do not include it in source code management systems, such as Git repositories. -- Be aware that if an Auth Token is committed to a public repository, it's at risk of exposure, and could remain in the repository's history, even if attempts are made to rewrite it. -- In case your Auth Token is accidentally published, immediately rotate it on the [Auth Token page](https://app.localstack.cloud/workspace/auth-tokens). - ::: +## Configuration Methods -### LocalStack CLI +Authentication requirements vary based on your chosen execution method. -You should set the `LOCALSTACK_AUTH_TOKEN` environment variable either before or during the startup of LocalStack using the `localstack` command-line interface (CLI). +### 1. lstk (Automated) +The `lstk` CLI automates the authentication lifecycle. On initial execution, it triggers a browser-based OAuth flow and stores the resulting token in your system keyring. No manual environment variable configuration is required. - - - \nlocalstack start`} - lang="shell" - /> - - - \nlocalstack start`} - lang="powershell" - /> - - - -:::note +```bash +lstk start -1. You can alternatively set the `LOCALSTACK_AUTH_TOKEN` environment variable in your shell session. - This ensures the Auth Token is transmitted to your LocalStack container, enabling key activation. -2. The `localstack auth set-token` command is only available for `localstack` CLI and cannot be used with a Docker/Docker Compose setup. - ::: +``` -You have the option to run your LocalStack container in the background by appending the `-d` flag to the `localstack start` command. +### 2. LocalStack CLI -The `localstack` CLI automatically detects the Auth Token and appropriately conveys it to the LocalStack container. +If you use the standard CLI, set your token using the `auth` command. This persists the credential in your local configuration. -:::note -If you are using LocalStack with an Auth Token, it's necessary to download the [LocalStack for AWS image](/aws/capabilities/config/docker-images#localstack-for-aws-image), which includes Pro services and several advanced features. -::: +### 3. Docker & Docker Compose -### Docker +For direct container execution, inject the token as an environment variable. -To start LocalStack via Docker, you need to provide the Auth Token using the `-e` flag, which is used for setting environment variables. +**Docker CLI:** -```bash {5} +```bash docker run \ --rm -it \ - -p 4566:4566 \ - -p 4510-4559:4510-4559 \ - -e LOCALSTACK_AUTH_TOKEN=${LOCALSTACK_AUTH_TOKEN:- } \ + -e LOCALSTACK_AUTH_TOKEN=${LOCALSTACK_AUTH_TOKEN} \ localstack/localstack-pro -``` -For more information about starting LocalStack with Docker, take a look at our [Docker installation](/aws/getting-started/installation/#docker) guide. - -### Docker Compose - -To start LocalStack using `docker compose`, you have to include the `LOCALSTACK_AUTH_TOKEN` environment variable in your `docker-compose.yml` file: - -```yaml -environment: - - LOCALSTACK_AUTH_TOKEN=${LOCALSTACK_AUTH_TOKEN- } ``` -You can manually set the Auth Token, or use the `export` command to establish the Auth Token in your current shell session. -This ensures the Auth Token is transmitted to your LocalStack container, enabling key activation. - -### CI Environments - -CI environments require a CI Auth Token. -Developer Auth Tokens cannot be used in CI. -CI Auth Tokens are available on the [Auth Tokens page](https://app.localstack.cloud/workspace/auth-tokens) and are configured similarly to Developer Auth Tokens. - -To set the CI Auth Token, add the Auth Token value in the `LOCALSTACK_AUTH_TOKEN` environment variable of your CI provider, and refer to it when starting LocalStack in your CI workflow. -You can find detailed examples in our [LocalStack in CI documentation](/aws/integrations/continuous-integration/). - -## Rotating the Auth Token +**Docker Compose:** -Your personal Auth Token provides full access to your workspace and LocalStack license. -It's important to treat auth tokens as confidential, avoiding sharing or storing them in source control management systems (SCMs) like Git. - -If you believe your Auth Token has been compromised or becomes known to someone else, reset it without delay. -When you reset a token, the old one is immediately deactivated, losing its ability to access your license or workspace. -It is not possible to restore previous tokens. +```yaml +services: + localstack: + image: localstack/localstack-pro + environment: + - LOCALSTACK_AUTH_TOKEN=${LOCALSTACK_AUTH_TOKEN} -To rotate your Auth Token, go to the [Auth Token page](https://app.localstack.cloud/workspace/auth-tokens) and select the **Reset Auth Token** option. +``` -## Licensing configuration & activation checkup +## License Assignment -To avoid logging any licensing-related error messages, set `LOG_LICENSE_ISSUES=0` in your environment. -Refer to our [configuration guide](/aws/capabilities/config/configuration/#localstack-for-aws) for more information. +An Auth Token is only valid if a license is assigned to your user identity or workspace. -The simplest method to verify if LocalStack is active is by querying the health endpoint for a list of running services: +**Assignment Workflow:** - - +1. Navigate to the [Users & Licenses page](https://app.localstack.cloud/workspace/members). +2. Identify the target user in **Workspace Members**. +3. Select the appropriate **Member Role** (Admins receive full permissions by default). +4. Save the configuration to activate the license for that identity. - ```bash - curl http://localhost:4566/_localstack/info | jq - ``` +:::note +An active Auth Token will fail to initialize the container if a valid license has not been assigned to the associated user. +::: - - - ```bash - Invoke-WebRequest -Uri http://localhost:4566/_localstack/info | ConvertFrom-Json - ``` +## Activation Verification - - +Verify the activation status by querying the LocalStack info endpoint: -The following output would be retrieved: +**Successful Activation Output:** -```bash +```json { - "version": "3.0.0:6dd3f3d", "edition": "pro", - "is_license_activated": true, - "session_id": "7132da5f-a380-44ca-8897-6f0fdfd7b1c9", - "machine_id": "0c49752c", - "system": "linux", - "is_docker": true, - "server_time_utc": "2023-11-21T05:41:33", - "uptime": 161 + "is_license_activated": true } -``` - -The `edition` field is always `pro` and the `is_license_activated` field is set to `true`. -Another way to confirm this is by checking the logs of the LocalStack container for a message indicating successful license activation: -```bash -[...] Successfully activated license ``` -Otherwise, check our [troubleshooting](#troubleshooting) section. - -## Troubleshooting - -While using Auth Tokens, LocalStack demands a successful license activation for startup. -If the activation of the license is unsuccessful, LocalStack will exit and display error messages. - -```bash -=============================================== -License activation failed! 🔑❌ - -Reason: The credentials defined in your environment are invalid. Please make sure to either set the LOCALSTACK_AUTH_TOKEN variable to a valid auth token, or the LOCALSTACK_API_KEY variable to a valid LocalStack API key. You can find your Auth Token or API key in the LocalStack web app https://app.localstack.cloud. - -Due to this error, Localstack has quit. LocalStack for AWS features can only be used with a valid license. - -- Please check that your credentials are set up correctly and that you have an active license. - You can find your credentials in our webapp at https://app.localstack.cloud. -- If you want to continue using LocalStack without pro features you can set `ACTIVATE_PRO=0`. -``` - -The key activation in LocalStack may fail for several reasons, and the most common ones are listed below in this section. - -### Missing Credentials - -You need to provide either an Auth Token to start the LocalStack for AWS image successfully. -You can find your Auth Token on the [Auth Tokens page](https://app.localstack.cloud/workspace/auth-tokens) in the LocalStack Web Application. - -If you are using the `localstack` CLI, you can set the `LOCALSTACK_AUTH_TOKEN` environment variable to your Auth Token or use the following command to set it up: - -```bash -localstack auth set-token -``` - -### Invalid License - -The issue may occur if there is no valid license linked to your account due to expiration or if the license has not been assigned. -You can check your license status in the LocalStack Web Application on the [My License page](https://app.localstack.cloud/workspace/my-license). - -### License Server Unreachable - -LocalStack initiates offline activation when the license server is unreachable, requiring re-activation every 24 hours. -Log output may indicate issues with your machine resolving the LocalStack API domain, which can be verified using a tool like `dig`: - -```bash -dig api.localstack.cloud -``` -If the result shows a status other than `status: NOERROR`, your machine is unable to resolve this domain. -Certain corporate DNS servers may filter requests to specific domains. -Kindly reach out to your network administrator to safelist `localstack.cloud` domain. +## Next steps -If you have any further problems concerning your license activation, or if the steps do not help, do not hesitate to [contact us](https://localstack.cloud/contact/). +You have successfully completed the Getting Started sequence! +Proceed to the [FAQ](https://www.google.com/search?q=/aws/getting-started/faq/) for troubleshooting common scenarios, or explore our [supported local AWS services](https://www.google.com/search?q=/aws/services/) to begin building. From e38c155cb36fabebd0fc082d39ede9b37eaed836 Mon Sep 17 00:00:00 2001 From: Quetzalli Date: Fri, 29 May 2026 00:46:22 +0200 Subject: [PATCH 18/58] Add Troubleshooting section to auth-token.mdx --- .../docs/aws/getting-started/auth-token.mdx | 55 ++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/src/content/docs/aws/getting-started/auth-token.mdx b/src/content/docs/aws/getting-started/auth-token.mdx index 500812095..a167d95ea 100644 --- a/src/content/docs/aws/getting-started/auth-token.mdx +++ b/src/content/docs/aws/getting-started/auth-token.mdx @@ -98,4 +98,57 @@ Verify the activation status by querying the LocalStack info endpoint: ## Next steps You have successfully completed the Getting Started sequence! -Proceed to the [FAQ](https://www.google.com/search?q=/aws/getting-started/faq/) for troubleshooting common scenarios, or explore our [supported local AWS services](https://www.google.com/search?q=/aws/services/) to begin building. +Proceed to the [FAQ](/aws/getting-started/faq/) for troubleshooting common scenarios, or explore our [supported local AWS services](/aws/services/) to begin building. + + +## Troubleshooting + +While using Auth Tokens, LocalStack demands a successful license activation for startup. +If the activation of the license is unsuccessful, LocalStack will exit and display error messages. + +```bash +=============================================== +License activation failed! 🔑❌ + +Reason: The credentials defined in your environment are invalid. Please make sure to either set the LOCALSTACK_AUTH_TOKEN variable to a valid auth token, or the LOCALSTACK_API_KEY variable to a valid LocalStack API key. You can find your Auth Token or API key in the LocalStack web app https://app.localstack.cloud. + +Due to this error, Localstack has quit. LocalStack for AWS features can only be used with a valid license. + +- Please check that your credentials are set up correctly and that you have an active license. + You can find your credentials in our webapp at https://app.localstack.cloud. +- If you want to continue using LocalStack without pro features you can set `ACTIVATE_PRO=0`. +``` + +The key activation in LocalStack may fail for several reasons, and the most common ones are listed below in this section. + +### Missing Credentials + +You need to provide either an Auth Token to start the LocalStack for AWS image successfully. +You can find your Auth Token on the [Auth Tokens page](https://app.localstack.cloud/workspace/auth-tokens) in the LocalStack Web Application. + +If you are using the `localstack` CLI, you can set the `LOCALSTACK_AUTH_TOKEN` environment variable to your Auth Token or use the following command to set it up: + +```bash +localstack auth set-token +``` + +### Invalid License + +The issue may occur if there is no valid license linked to your account due to expiration or if the license has not been assigned. +You can check your license status in the LocalStack Web Application on the [My License page](https://app.localstack.cloud/workspace/my-license). + +### License Server Unreachable + +LocalStack initiates offline activation when the license server is unreachable, requiring re-activation every 24 hours. +Log output may indicate issues with your machine resolving the LocalStack API domain, which can be verified using a tool like `dig`: + +```bash +dig api.localstack.cloud +``` + +If the result shows a status other than `status: NOERROR`, your machine is unable to resolve this domain. +Certain corporate DNS servers may filter requests to specific domains. +Kindly reach out to your network administrator to safelist `localstack.cloud` domain. + +If you have any further problems concerning your license activation, or if the steps do not help, don't hesitate to [contact us](https://localstack.cloud/contact/). + From 3a9ce052594ca6786336390827aad08fe1935eb4 Mon Sep 17 00:00:00 2001 From: Quetzalli Date: Fri, 29 May 2026 12:15:11 +0200 Subject: [PATCH 19/58] remove dead code from global.css --- src/styles/global.css | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/src/styles/global.css b/src/styles/global.css index 33e14b98d..c00c4feb1 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -108,30 +108,6 @@ h3 { transform: translateY(-2px); } -.path-secondary-card { - margin-top: 1rem; -} - -.path-secondary-card .path-secondary-card__title { - font-size: 18px; - font-weight: 500; - letter-spacing: -0.12px; -} - -.path-secondary-card .path-secondary-card__body { - font-size: 16px; - line-height: 26px; - color: var(--sl-color-gray-3); -} - -.path-secondary-card .path-secondary-card__body > :first-child { - margin-top: 0; -} - -.path-secondary-card .path-secondary-card__body > :last-child { - margin-bottom: 0; -} - .service-box-content { height: 100%; display: flex; From 51aa017779a4e74991193de9d70812fb2b736820 Mon Sep 17 00:00:00 2001 From: Quetzalli Date: Fri, 29 May 2026 12:40:32 +0200 Subject: [PATCH 20/58] add install options + fix missing closing tags --- .../docs/aws/getting-started/installation.mdx | 142 +++++++++++++++++- 1 file changed, 137 insertions(+), 5 deletions(-) diff --git a/src/content/docs/aws/getting-started/installation.mdx b/src/content/docs/aws/getting-started/installation.mdx index 8e792ceff..eed8fd769 100644 --- a/src/content/docs/aws/getting-started/installation.mdx +++ b/src/content/docs/aws/getting-started/installation.mdx @@ -57,28 +57,160 @@ The LocalStack CLI is the primary tool for managing all LocalStack capabilities. ### Install LocalStack CLI -x86-64 -ARM64 -Extract the binary to `/usr/local/bin`: + + + + +You can download the pre-built binary for your architecture using the link below: + + + x86-64 + + + ARM64 + + +or use the curl commands below: + +For x86-64: + + - +For ARM64: + + +Then extract the LocalStack CLI from the terminal: + + + +
+Alternative: Homebrew on Linux + +If you are using [Homebrew for Linux](https://docs.brew.sh/Homebrew-on-Linux), you can install the LocalStack CLI directly from our official LocalStack tap: ```bash brew install localstack/tap/localstack-cli +``` + +
+
+ + + +You can install the LocalStack CLI using Brew directly from our official LocalStack tap: + +```bash +brew install localstack/tap/localstack-cli ``` +
+Alternative: Binary Download + +You may download the binary for your architecture using the link below: + + + Intel (AMD64) + + +or use the following curl command: + + + +Then extract the LocalStack CLI from the terminal: + + + +
+
+ + + +You can download the pre-built binary for your architecture using the link below: + + + Intel (AMD64) + + +Then extract the archive and execute the binary in Powershell. + + + + + +If you cannot use the binary releases of LocalStack, you can install the Python distribution. + +Please make sure to install the following before moving ahead: + +- [Python](https://docs.python.org/3/using/index.html) +- [pip](https://pip.pypa.io/en/stable/installation/) + +Next install the LocalStack CLI in your Python environment by running: + ```bash python3 -m pip install --upgrade localstack +``` +:::note +To download a specific version of LocalStack, replace `` with the required version from [release page](https://github.com/localstack/localstack/releases). + +```bash +python3 -m pip install localstack== +``` + +::: + +:::tip[MacOS Sierra?] +If you have problems with permissions in MacOS X Sierra, install with: + +```bash +python3 -m pip install --user localstack ``` +::: + :::danger -Do not use `sudo` or the `root` user. Install and execute LocalStack entirely under a local non-root user. +Do not use `sudo` or the `root` user when starting LocalStack. +It should be installed and started entirely under a local non-root user. ::: + +
+ ### Start LocalStack CLI From f17c2b95d37517e3f7690551bb47293ab313c31a Mon Sep 17 00:00:00 2001 From: Quetzalli Date: Fri, 29 May 2026 13:09:33 +0200 Subject: [PATCH 21/58] update anchor links --- .../aws/capabilities/cloud-sandbox/ephemeral-instances.md | 2 +- .../capabilities/security-testing/custom-tls-certificates.mdx | 2 +- .../docs/aws/capabilities/state-management/cloud-pods.mdx | 2 +- src/content/docs/aws/services/ec2.mdx | 2 +- src/content/docs/aws/services/lambda.mdx | 2 +- src/content/docs/aws/tooling/aws-replicator.mdx | 4 ++-- src/content/docs/aws/tooling/localstack-cli.md | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/content/docs/aws/capabilities/cloud-sandbox/ephemeral-instances.md b/src/content/docs/aws/capabilities/cloud-sandbox/ephemeral-instances.md index 6f78205f4..5cb6bd80f 100644 --- a/src/content/docs/aws/capabilities/cloud-sandbox/ephemeral-instances.md +++ b/src/content/docs/aws/capabilities/cloud-sandbox/ephemeral-instances.md @@ -87,7 +87,7 @@ If you have created a Cloud Pod from an older version of LocalStack, you need to ## Ephemeral Instances CLI -The Ephemeral Instances CLI is included in the [LocalStack CLI installation](/aws/getting-started/installation/#installing-localstack-cli), so no additional installations are needed to start using it. +The Ephemeral Instances CLI is included in the [LocalStack CLI installation](/aws/getting-started/installation/#install-localstack-cli), so no additional installations are needed to start using it. If you're a licensed user, setting the `LOCALSTACK_AUTH_TOKEN` as an environment variable is recommended to access all features of the Ephemeral Instances CLI. Access the Ephemeral Instances CLI by running the `localstack ephemeral` command from your terminal. diff --git a/src/content/docs/aws/capabilities/security-testing/custom-tls-certificates.mdx b/src/content/docs/aws/capabilities/security-testing/custom-tls-certificates.mdx index 0b070258f..309273172 100644 --- a/src/content/docs/aws/capabilities/security-testing/custom-tls-certificates.mdx +++ b/src/content/docs/aws/capabilities/security-testing/custom-tls-certificates.mdx @@ -30,7 +30,7 @@ They all can be summarised as: ## Creating a custom docker image -If you run LocalStack in a docker container (which includes using [the CLI](/aws/getting-started/installation/#installing-localstack-cli), [docker](/aws/getting-started/installation/#docker), [docker-compose](/aws/getting-started/installation/#docker-compose), or [helm](/aws/getting-started/installation/#helm)), to include a custom TLS root certificate a new docker image should be created. +If you run LocalStack in a docker container (which includes using [the CLI](/aws/getting-started/installation/#install-localstack-cli), [docker](/aws/getting-started/installation/#docker-compose), [docker-compose](/aws/getting-started/installation/#docker-compose), or [helm](/aws/getting-started/installation/#helm-kubernetes)), to include a custom TLS root certificate a new docker image should be created. Create a `Dockerfile` containing the following commands: diff --git a/src/content/docs/aws/capabilities/state-management/cloud-pods.mdx b/src/content/docs/aws/capabilities/state-management/cloud-pods.mdx index 10c52cbad..94a2519a2 100644 --- a/src/content/docs/aws/capabilities/state-management/cloud-pods.mdx +++ b/src/content/docs/aws/capabilities/state-management/cloud-pods.mdx @@ -28,7 +28,7 @@ You can save and load the persistent state of Cloud Pods, you can use the [Cloud LocalStack provides a remote storage backend that can be used to store the state of your running application and share it with your team members. You can interact with the Cloud Pods over the storage backend via the LocalStack Web Application. -Cloud Pods CLI is included in the [LocalStack CLI installation](/aws/getting-started/installation/#installing-localstack-cli), so there's no need for additional installations to begin using it. +Cloud Pods CLI is included in the [LocalStack CLI installation](/aws/getting-started/installation/#install-localstack-cli), so there's no need for additional installations to begin using it. If you're a licensed user, we suggest setting the `LOCALSTACK_AUTH_TOKEN` as an environment variable. This enables you to access the complete range of LocalStack Cloud Pods features. diff --git a/src/content/docs/aws/services/ec2.mdx b/src/content/docs/aws/services/ec2.mdx index cf70e9cda..5234b2137 100644 --- a/src/content/docs/aws/services/ec2.mdx +++ b/src/content/docs/aws/services/ec2.mdx @@ -494,7 +494,7 @@ If you are using the [Docker Compose template](/aws/getting-started/installation "/var/run/libvirt/libvirt-sock:/var/run/libvirt/libvirt-sock" ``` -If you are using [Docker CLI](/aws/getting-started/installation#docker), include the following parameter in `docker run`: +If you are using [Docker CLI](/aws/getting-started/installation#docker-cli), include the following parameter in `docker run`: ```text -v /var/run/libvirt/libvirt-sock:/var/run/libvirt/libvirt-sock diff --git a/src/content/docs/aws/services/lambda.mdx b/src/content/docs/aws/services/lambda.mdx index dc6e5158a..26b1274dd 100644 --- a/src/content/docs/aws/services/lambda.mdx +++ b/src/content/docs/aws/services/lambda.mdx @@ -578,7 +578,7 @@ With the new implementation, the following changes have been introduced: - To run Lambda functions in LocalStack, mount the Docker socket into the LocalStack container. Add the following Docker volume mount to your LocalStack startup configuration: `/var/run/docker.sock:/var/run/docker.sock`. - You can find an example of this configuration in our official [`docker-compose.yml` file](/aws/getting-started/installation/#starting-localstack-with-docker-compose). + You can find an example of this configuration in our official [`docker-compose.yml` file](/aws/getting-started/installation/#docker-compose). - The `v2` provider discontinues Lambda Executor Modes such as `LAMBDA_EXECUTOR=local`. Previously, this mode was used as a fallback when the Docker socket was unavailable in the LocalStack container, but many users unintentionally used it instead of the configured `LAMBDA_EXECUTOR=docker`. The new provider now behaves similarly to the old `docker-reuse` executor and does not require such configuration. diff --git a/src/content/docs/aws/tooling/aws-replicator.mdx b/src/content/docs/aws/tooling/aws-replicator.mdx index ab6850812..f42c76a1f 100644 --- a/src/content/docs/aws/tooling/aws-replicator.mdx +++ b/src/content/docs/aws/tooling/aws-replicator.mdx @@ -29,7 +29,7 @@ A valid `LOCALSTACK_AUTH_TOKEN` must be configured to start the LocalStack for A :::note The Replicator is in limited preview and is available from LocalStack CLI version 4.2.0. -If you encounter issues, update your [LocalStack CLI](/aws/getting-started/installation/#updating-localstack-cli). +If you encounter issues, update your [LocalStack CLI](/aws/getting-started/installation/#update-localstack-cli). ::: ### Retrieve credentials to access AWS @@ -74,7 +74,7 @@ Both methods have two steps: The Replicator CLI is part of the LocalStack CLI. -Follow the [installation instructions](/aws/getting-started/installation/#installing-localstack-cli) to set it up. +Follow the [installation instructions](/aws/getting-started/installation/#install-localstack-cli) to set it up. To start a replication job, get the ARN of the resource to replicate. Then, trigger the job using the command: diff --git a/src/content/docs/aws/tooling/localstack-cli.md b/src/content/docs/aws/tooling/localstack-cli.md index 063f4efb9..ee64c8126 100644 --- a/src/content/docs/aws/tooling/localstack-cli.md +++ b/src/content/docs/aws/tooling/localstack-cli.md @@ -12,7 +12,7 @@ tags: ["Hobby"] The LocalStack Command Line Interface (CLI) is a tool for starting, managing, and configuring your LocalStack container. It provides convenience features to interact with LocalStack features like Cloud Pods, Extensions, State Management, and more. -To install the LocalStack CLI, follow the [installation guide](/aws/getting-started/installation/#installing-localstack-cli). +To install the LocalStack CLI, follow the [installation guide](/aws/getting-started/installation/#install-localstack-cli). :::note This documentation was auto-generated from LocalStack CLI version `LocalStack CLI 2026.3.0`. From df7a4ec293cab8e0c68fc34224361f54bbb83157 Mon Sep 17 00:00:00 2001 From: Quetzalli Date: Fri, 29 May 2026 13:12:18 +0200 Subject: [PATCH 22/58] update more anchor links --- .../docs/aws/capabilities/state-management/cloud-pods.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/aws/capabilities/state-management/cloud-pods.mdx b/src/content/docs/aws/capabilities/state-management/cloud-pods.mdx index 94a2519a2..d96146d20 100644 --- a/src/content/docs/aws/capabilities/state-management/cloud-pods.mdx +++ b/src/content/docs/aws/capabilities/state-management/cloud-pods.mdx @@ -451,7 +451,7 @@ localstack pod list s3-storage-aws :::note Full S3 remotes support is available in the CLI from version 3.2.0. -If you experience any difficulties, update your [LocalStack CLI](/aws/getting-started/installation/#updating-localstack-cli). +If you experience any difficulties, update your [LocalStack CLI](/aws/getting-started/installation/#update-localstack-cli). ::: ### ORAS remote storage From 66a567519639d2a2041a75e94f917cd0bb78484c Mon Sep 17 00:00:00 2001 From: Quetzalli Date: Tue, 2 Jun 2026 11:54:45 +0200 Subject: [PATCH 23/58] fix broken command block --- .../docs/aws/getting-started/local-development.mdx | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/content/docs/aws/getting-started/local-development.mdx b/src/content/docs/aws/getting-started/local-development.mdx index bb8ca588f..da3a4f2b6 100644 --- a/src/content/docs/aws/getting-started/local-development.mdx +++ b/src/content/docs/aws/getting-started/local-development.mdx @@ -295,9 +295,18 @@ Stop your LocalStack container to remove all emulated resources. LocalStack is e {/* prettier-ignore-start */} - ```bash lstk stop ``` - ```bash localstack stop ``` + + ```bash + lstk stop + ``` + + + ```bash + localstack stop + ``` + + {/* prettier-ignore-end */} To persist state across restarts, see [Persistence](/aws/capabilities/state-management/persistence/) or [Cloud Pods](/aws/capabilities/state-management/cloud-pods/). From 9ec543cdaeabac50e45e426cf319f386b264b0ea Mon Sep 17 00:00:00 2001 From: Quetzalli Date: Tue, 2 Jun 2026 12:08:51 +0200 Subject: [PATCH 24/58] Apply suggestions from code review Co-authored-by: Harsh Mishra Co-authored-by: Quetzalli --- src/content/docs/aws/getting-started/ai-workflows.mdx | 4 ++-- src/content/docs/aws/getting-started/auth-token.mdx | 2 +- src/content/docs/aws/getting-started/ci-cd.mdx | 9 ++++----- src/content/docs/aws/getting-started/installation.mdx | 2 +- .../docs/aws/getting-started/local-development.mdx | 3 ++- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/content/docs/aws/getting-started/ai-workflows.mdx b/src/content/docs/aws/getting-started/ai-workflows.mdx index 2427ddbbe..911918adb 100644 --- a/src/content/docs/aws/getting-started/ai-workflows.mdx +++ b/src/content/docs/aws/getting-started/ai-workflows.mdx @@ -3,7 +3,7 @@ title: AI & Agent Workflows description: Integrate LocalStack with AI coding assistants, MCP servers, and agent-driven infrastructure automation. template: doc sidebar: - order: 5 + order: 6 --- LocalStack provides a secure, emulated environment for developing and testing AI-assisted workflows. You can iterate on AI-generated infrastructure code and agentic deployment tasks without incurring cloud costs or risking production AWS environments by using a local cloud sandbox. @@ -22,7 +22,7 @@ LocalStack provides a secure, emulated environment for developing and testing AI The LocalStack MCP Server connects compatible AI clients (such as Claude, Cursor, or Windsurf) to your local cloud environment. This integration allows AI agents to manage the full local cloud lifecycle, including container management, resource deployment, and log analysis. :::note[Official MCP Documentation] -For detailed configuration instructions, prerequisite checks, and the complete tool reference, read our [LocalStack MCP Server guide](https://docs.localstack.cloud/aws/tooling/mcp-server/). You don't need to start LocalStack manually before using MCP; agents can initialize the container using the management tools provided by the server. +For detailed configuration instructions, prerequisite checks, and the complete tool reference, read our [LocalStack MCP Server guide](/aws/tooling/mcp-server/). You don't need to start LocalStack manually before using MCP; agents can initialize the container using the management tools provided by the server. ::: diff --git a/src/content/docs/aws/getting-started/auth-token.mdx b/src/content/docs/aws/getting-started/auth-token.mdx index a167d95ea..295f71c35 100644 --- a/src/content/docs/aws/getting-started/auth-token.mdx +++ b/src/content/docs/aws/getting-started/auth-token.mdx @@ -3,7 +3,7 @@ title: Auth Token description: Configure and manage LocalStack Auth Tokens for local development and CI/CD environments. template: doc sidebar: - order: 6 + order: 3 --- import { Code, Tabs, TabItem } from '@astrojs/starlight/components'; diff --git a/src/content/docs/aws/getting-started/ci-cd.mdx b/src/content/docs/aws/getting-started/ci-cd.mdx index fb7ac2f10..6c2671b0f 100644 --- a/src/content/docs/aws/getting-started/ci-cd.mdx +++ b/src/content/docs/aws/getting-started/ci-cd.mdx @@ -1,9 +1,9 @@ --- title: CI/CD Integration -description: implementation guides for LocalStack in automated pipelines, including GitHub Actions, Docker Compose, and state management. +description: Implementation guides for LocalStack in automated pipelines, including GitHub Actions, Docker Compose, and state management. template: doc sidebar: - order: 4 + order: 5 --- import { Tabs, TabItem } from '@astrojs/starlight/components'; @@ -68,11 +68,10 @@ Select the integration method compatible with your CI runner architecture. awslocal s3 mb s3://integration-test-bucket pytest tests/integration/ ``` - - The `setup-localstack` action pulls the image, starts the container, and waits for LocalStack to be ready. - + + Define LocalStack as a service in your `docker-compose.yml` for containerized environments: diff --git a/src/content/docs/aws/getting-started/installation.mdx b/src/content/docs/aws/getting-started/installation.mdx index eed8fd769..92a28ee2c 100644 --- a/src/content/docs/aws/getting-started/installation.mdx +++ b/src/content/docs/aws/getting-started/installation.mdx @@ -3,7 +3,7 @@ title: Installation description: Installation guides for LocalStack CLIs, container engines, and orchestration tools. template: doc sidebar: - order: 2 + order: 3 --- import { Code, LinkButton, Tabs, TabItem } from '@astrojs/starlight/components'; diff --git a/src/content/docs/aws/getting-started/local-development.mdx b/src/content/docs/aws/getting-started/local-development.mdx index da3a4f2b6..b270d80f9 100644 --- a/src/content/docs/aws/getting-started/local-development.mdx +++ b/src/content/docs/aws/getting-started/local-development.mdx @@ -3,7 +3,7 @@ title: Local Development description: Deploy a serverless application locally using Lambda and DynamoDB on LocalStack. template: doc sidebar: - order: 3 + order: 4 --- import { Tabs, TabItem, Steps } from '@astrojs/starlight/components'; @@ -24,6 +24,7 @@ Select your preferred deployment method to begin: **AWS CLI** or **Terraform**. - [Docker](https://docs.docker.com/get-docker/) engine installed and active. - A [LocalStack account](https://app.localstack.cloud/sign-up). +- [Auth Token](/aws/getting-started/auth-token/) ## Step 1: Install and Start LocalStack From a0dee9b9c806d5c467674283ccf96eb7f6a6764b Mon Sep 17 00:00:00 2001 From: HarshCasper Date: Wed, 3 Jun 2026 16:31:43 +0530 Subject: [PATCH 25/58] Update local development getting started guide --- .../aws/localstack-resource-browser.png | Bin 0 -> 377326 bytes .../aws/getting-started/local-development.mdx | 93 +++++++++--------- 2 files changed, 47 insertions(+), 46 deletions(-) create mode 100644 public/images/aws/localstack-resource-browser.png diff --git a/public/images/aws/localstack-resource-browser.png b/public/images/aws/localstack-resource-browser.png new file mode 100644 index 0000000000000000000000000000000000000000..a228b2b7ea926427be47e9dc539131a66e28081f GIT binary patch literal 377326 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 l-& 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�h)h8=ShA(5?`$`$>4eXt#3dCi;HE55n_)of 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 x|M$sb - Install `lstk`: - - ```bash - brew install localstack/tap/lstk - ``` + The `lstk` CLI provides the fastest initialization path by automating authentication and image management. + Ensure you have [installed](/aws/getting-started/installation/#install-lstk) `lstk` before starting LocalStack. Start LocalStack: @@ -51,59 +45,62 @@ The `lstk` CLI provides the fastest initialization path by automating authentica ```text ✔︎ LocalStack ready (containerId: 400b3e61f3c6) • Endpoint: localhost.localstack.cloud:4566 - • Web app: [https://app.localstack.cloud](https://app.localstack.cloud) + • Web app: https://app.localstack.cloud ``` :::note[Early Release] - `lstk` currently supports core lifecycle commands (start, stop, logs, status). For advanced features such as Cloud Pods or Extensions, use the [LocalStack CLI](/aws/getting-started/installation/#localstack-cli). + `lstk` currently supports core lifecycle commands (start, stop, logs, status). + To learn more about `lstk`, see the [lstk documentation](/aws/tooling/lstk/). + For advanced features such as Cloud Pods or Extensions, use the [LocalStack CLI](/aws/getting-started/installation/#localstack-cli). ::: - If you are using the full-featured LocalStack CLI, ensure you have [configured your auth token](/aws/getting-started/auth-token/) before starting: + If you are using the full-featured LocalStack CLI, ensure you have [installed](/aws/getting-started/installation/#install-localstack-cli) it and [configured your auth token](/aws/getting-started/auth-token/) before starting: + + Start LocalStack: ```bash localstack start ``` - + When the container is ready, you'll see these log lines: ```bash - __ _______ __ __ + __ _______ __ __ / / ____ _________ _/ / ___// /_____ ______/ /__ / / / __ \/ ___/ __ `/ /\__ \/ __/ __ `/ ___/ //_/ / /___/ /_/ / /__/ /_/ / /___/ / /_/ /_/ / /__/ ,< /_____/\____/\___/\__,_/_//____/\__/\__,_/\___/_/|_| - 💻 LocalStack CLI ${LOCALSTACK_VERSION} - 👤 Profile: default + - LocalStack CLI: 2026.5.1 + - Profile: default + - App: https://app.localstack.cloud - [12:47:13] starting LocalStack in Docker mode 🐳 localstack.py:494 - preparing environment bootstrap.py:1240 - configuring container bootstrap.py:1248 - starting container bootstrap.py:1258 - [12:47:15] detaching bootstrap.py:1262 + [14:37:38] starting LocalStack in Docker mode 🐳 localstack.py:542 + ... + Ready. ``` -## Step 2: Deploy serverless API +## Step 2: Deploy the Serverless API -Deploy the Lambda function and DynamoDB table using either the `awslocal` or `tflocal` wrappers. These tools automatically route commands to your local instance instead of AWS. +You can deploy the Lambda function and DynamoDB table using either our AWS CLI wrapper `awslocal` or our Terraform wrapper `tflocal`. +These tools automatically route AWS API calls to your LocalStack container, so you do not need AWS account credentials for this guide. - 1. Install the `awslocal` wrapper: + 1. Install the [`awslocal` wrapper](https://github.com/localstack/awscli-local): ```bash pip install awscli-local ``` - 2. Create the Lambda function source. - Execute the following to create a project directory and a Python handler: + 2. Create the Lambda function source. Execute the following to create a project directory, a function file and a Python handler: ```bash mkdir -p /tmp/localstack-demo @@ -147,7 +144,7 @@ Deploy the Lambda function and DynamoDB table using either the `awslocal` or `tf awslocal lambda wait function-active --function-name messages-api ``` - 5. Configure a public URL and retrieve the endpoint: + 5. Configure a function URL and retrieve the endpoint: ```bash awslocal lambda create-function-url-config \ @@ -165,15 +162,17 @@ Deploy the Lambda function and DynamoDB table using either the `awslocal` or `tf - 1. Install Terraform and the `tflocal` wrapper: + 1. Install the [`tflocal` wrapper](https://github.com/localstack/terraform-local): ```bash pip install terraform-local ``` - 2. Create a `main.tf` file in a new directory: + 2. Create a project directory and a `main.tf` file: - ```hcl + ```bash + mkdir -p /tmp/localstack-demo + cat > /tmp/localstack-demo/main.tf << 'TF' terraform { required_providers { aws = { source = "hashicorp/aws" } @@ -240,6 +239,8 @@ Deploy the Lambda function and DynamoDB table using either the `awslocal` or `tf output "function_url" { value = aws_lambda_function_url.messages_api.function_url } + TF + cd /tmp/localstack-demo ``` 3. Initialize and apply the configuration: @@ -260,35 +261,36 @@ Deploy the Lambda function and DynamoDB table using either the `awslocal` or `tf ## Step 3: Test the API -Send a POST request to store a message in the emulated DynamoDB table: +Send a POST request to store a message in the locally emulated DynamoDB table: ```bash curl -X POST "$LAMBDA_URL" \ -H "Content-Type: application/json" \ -d '{"message": "Hello, LocalStack!"}' - ``` You will get back a response: -```json -{ "id": "a1b2c3d4-...", "message": "Hello, LocalStack!" } +```json title="Output" +{ "id": "3e1b5cae-4386-447b-8567-f0615fdb0fff", "message": "Hello, LocalStack!" } ``` Retrieve all your messages: ```bash curl "$LAMBDA_URL" - ``` -The Lambda function executes within the local environment and interacts with the emulated DynamoDB service. Because no actual cloud resources are created, you won't incur any cloud costs or infrastructure changes. +The Lambda function executes within the local environment and interacts with the locally emulated DynamoDB service. +Because no actual cloud resources are created, you won't incur any real AWS cloud costs or infrastructure changes. ## Step 4: Inspect Resources View the state of your local infrastructure via the [LocalStack Web Application](https://app.localstack.cloud/). Navigate to the [Resource Browser](https://app.localstack.cloud/inst/default/status) to inspect your Lambda functions and DynamoDB tables in real-time. +![Inspect Resources using LocalStack Web Application](/images/aws/localstack-resource-browser.png) + ## Step 5: Clean Up Stop your LocalStack container to remove all emulated resources. LocalStack is ephemeral by default; stopping the instance clears the state. @@ -310,16 +312,15 @@ Stop your LocalStack container to remove all emulated resources. LocalStack is e {/* prettier-ignore-end */} -To persist state across restarts, see [Persistence](/aws/capabilities/state-management/persistence/) or [Cloud Pods](/aws/capabilities/state-management/cloud-pods/). +To persist resource state, like S3 buckets or DynamoDB tables, across restarts, check out our [state management tools](/aws/capabilities/state-management/). Remove the local files you created in this guide: ```bash rm -rf /tmp/localstack-demo - ``` ## Next steps -You have successfully deployed and tested a serverless API on your local workstation. Proceed to the [CI/CD guide](/aws/getting-started/ci-cd/) to learn how to integrate LocalStack into your automated testing pipelines and GitHub Actions workflows. - +You have successfully deployed and tested a serverless API on your local workstation. +Proceed to the [CI/CD guide](/aws/getting-started/ci-cd/) to learn how to integrate LocalStack into your automated continuous integration (CI) pipelines across a wide range of providers and platforms. From 35469fcc9fd880ac6ea27cb0db534f9f52953ac0 Mon Sep 17 00:00:00 2001 From: HarshCasper Date: Thu, 4 Jun 2026 00:23:09 +0530 Subject: [PATCH 26/58] Update installation getting started guide --- astro.config.mjs | 4 +- .../docs/aws/getting-started/installation.mdx | 154 +++++++++++------- .../aws/getting-started/local-development.mdx | 2 +- 3 files changed, 97 insertions(+), 63 deletions(-) diff --git a/astro.config.mjs b/astro.config.mjs index 90ed8d5f1..3d7d56aee 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -15,9 +15,9 @@ import react from '@astrojs/react'; import tailwindcss from '@tailwindcss/vite'; -// Fetch the latest release version from GitHub +// Fetch the latest LocalStack CLI release version from GitHub. const response = await fetch( - 'https://api.github.com/repos/localstack/localstack/releases/latest', + 'https://api.github.com/repos/localstack/localstack-cli/releases/latest', { headers: { Accept: 'application/vnd.github+json' }, }, diff --git a/src/content/docs/aws/getting-started/installation.mdx b/src/content/docs/aws/getting-started/installation.mdx index 92a28ee2c..116053d8f 100644 --- a/src/content/docs/aws/getting-started/installation.mdx +++ b/src/content/docs/aws/getting-started/installation.mdx @@ -1,6 +1,6 @@ --- title: Installation -description: Installation guides for LocalStack CLIs, container engines, and orchestration tools. +description: Install LocalStack with lstk, the LocalStack CLI, Docker, Docker Compose, or Helm. template: doc sidebar: order: 3 @@ -9,29 +9,33 @@ sidebar: import { Code, LinkButton, Tabs, TabItem } from '@astrojs/starlight/components'; import { LOCALSTACK_VERSION } from 'astro:env/server'; -LocalStack provides multiple installation paths depending on your development environment and requirements. We recommend using a CLI-based installation for the most consistent local development experience. +## Introduction -Choose the CLI that fits your workflow: use [`lstk`](#lstk) for a streamlined, non-Python setup, or [LocalStack CLI](#localstack-cli) for access to our complete feature set. +LocalStack provides multiple installation paths depending on your development environment and requirements. We recommend a CLI-based installation for the most consistent local startup experience. + +Choose the CLI that fits your workflow: use [`lstk`](#lstk) to install, authenticate, and start LocalStack with minimal setup, or use the [LocalStack CLI](#localstack-cli) when you need full-featured management commands for advanced workflows. ## lstk -`lstk` is a lightweight, Go-based binary that manages the authentication and container lifecycle in a single workflow. +`lstk` is a lightweight CLI for LocalStack that manages the authentication and container lifecycle in a single workflow. + +**Requirement:** You must have a working [Docker installation](https://docs.docker.com/get-docker/) before proceeding. :::caution[Early Release] `lstk` currently supports core lifecycle commands: `start`, `stop`, `logs`, and `status`. For advanced features like Cloud Pods or Extensions, use the [LocalStack CLI](#localstack-cli). ::: -**Install lstk** +### Install lstk - ```bash - brew install localstack/tap/lstk + ```bash + brew install localstack/tap/lstk ``` - ```bash - npm install -g @localstack/lstk + ```bash + npm install -g @localstack/lstk ``` @@ -39,19 +43,25 @@ Choose the CLI that fits your workflow: use [`lstk`](#lstk) for a streamlined, n -**Start LocalStack** +### Start lstk ```bash lstk start - ``` The first execution initiates a browser-based login flow. Subsequent starts use credentials stored in your system keyring. +### Update lstk + +```bash +lstk update +``` + +For more details, see the [lstk documentation](/aws/tooling/lstk/). -## LocalStack CLI +## LocalStack CLI -The LocalStack CLI is the primary tool for managing all LocalStack capabilities. +The LocalStack CLI provides the full command set for managing LocalStack capabilities such as Cloud Pods, Extensions, and advanced state workflows. **Requirement:** You must have a working [Docker installation](https://docs.docker.com/get-docker/) before proceeding. @@ -115,7 +125,7 @@ brew install localstack/tap/localstack-cli - + You can install the LocalStack CLI using Brew directly from our official LocalStack tap: @@ -140,7 +150,7 @@ or use the following curl command: @@ -159,14 +169,14 @@ Then extract the LocalStack CLI from the terminal: You can download the pre-built binary for your architecture using the link below: Intel (AMD64) -Then extract the archive and execute the binary in Powershell. +Then extract the archive and execute the binary in PowerShell. @@ -186,38 +196,35 @@ python3 -m pip install --upgrade localstack ``` :::note -To download a specific version of LocalStack, replace `` with the required version from [release page](https://github.com/localstack/localstack/releases). - +To download a specific version of LocalStack CLI, replace `` with the required version from [release page](https://github.com/localstack/localstack-cli/releases). ```bash python3 -m pip install localstack== ``` - ::: -:::tip[MacOS Sierra?] -If you have problems with permissions in MacOS X Sierra, install with: - +:::tip[macOS Sierra?] +If you have problems with permissions in macOS Sierra, install with: ```bash python3 -m pip install --user localstack ``` - ::: :::danger Do not use `sudo` or the `root` user when starting LocalStack. It should be installed and started entirely under a local non-root user. ::: - - - ### Start LocalStack CLI To verify that the LocalStack CLI was installed correctly, you can check the version in your terminal: - +```bash +localstack --version +``` + + You are all set! @@ -231,22 +238,25 @@ Once you've set up your auth token, you can start LocalStack with the following localstack start # start localstack in background with -d flag ``` -```bash - __ _______ __ __ +{/* prettier-ignore */} + ### Update LocalStack CLI @@ -276,70 +286,86 @@ Updating the LocalStack CLI using `localstack update localstack-cli` and `locals If it was installed using the pre-built binary or via Brew, please run the installation steps again to update to the latest version. ::: +For more details, see the [LocalStack CLI documentation](/aws/tooling/localstack-cli/). -## Container & Orchestration Methods +## Container and orchestration tools -Use these methods for CI pipelines, server environments, or manual container management. +Use these methods when you need explicit container configuration, want to run LocalStack alongside other services, or deploy LocalStack in CI and Kubernetes environments. +For everyday local development, `lstk` or the LocalStack CLI is usually simpler. ### Docker Compose -Recommended for CI and team environments. Create a `docker-compose.yml` with the following configuration: +Use Docker Compose when you want a reusable configuration file that can be shared across a team or checked into a project repository. +Create a `docker-compose.yml` with the following configuration: ```yaml services: localstack: - container_name: "${LOCALSTACK_DOCKER_NAME:-localstack-main}" - image: localstack/localstack-pro + container_name: '${LOCALSTACK_DOCKER_NAME:-localstack-main}' + image: localstack/localstack ports: - - "127.0.0.1:4566:4566" # Gateway - - "127.0.0.1:4510-4559:4510-4559" # External service range + - '127.0.0.1:4566:4566' # LocalStack Gateway + - '127.0.0.1:4510-4559:4510-4559' # external services port range + - '127.0.0.1:443:443' # LocalStack HTTPS Gateway environment: - - LOCALSTACK_AUTH_TOKEN=${LOCALSTACK_AUTH_TOKEN:?} + # Activate LocalStack for AWS: https://docs.localstack.cloud/getting-started/auth-token/ + - LOCALSTACK_AUTH_TOKEN=${LOCALSTACK_AUTH_TOKEN:?} # required for Pro + # LocalStack configuration: https://docs.localstack.cloud/references/configuration/ + - DEBUG=${DEBUG:-0} - PERSISTENCE=${PERSISTENCE:-0} volumes: - - "${LOCALSTACK_VOLUME_DIR:-./volume}:/var/lib/localstack" - - "/var/run/docker.sock:/var/run/docker.sock" - + - '${LOCALSTACK_VOLUME_DIR:-./volume}:/var/lib/localstack' + - '/var/run/docker.sock:/var/run/docker.sock' ``` Execute `docker compose up` to start. ### Docker CLI -Run the container directly via the Docker engine: +Use the Docker CLI for one-off starts or when you want to test a container configuration before moving it into Compose: ```bash docker run \ --rm -it \ -p 127.0.0.1:4566:4566 \ -p 127.0.0.1:4510-4559:4510-4559 \ - -v /var/run/docker.sock:/var/run/docker.sock \ + -p 127.0.0.1:443:443 \ -e LOCALSTACK_AUTH_TOKEN=${LOCALSTACK_AUTH_TOKEN:?} \ - localstack/localstack-pro - + -v /var/run/docker.sock:/var/run/docker.sock \ + localstack/localstack ``` +:::note +The Docker Compose and Docker CLI examples above use the same runtime settings: + +- The `4566` port exposes the LocalStack Gateway. +- The `4510-4559` range exposes external service ports used by services that bind additional endpoints. +- The `443` port exposes the LocalStack HTTPS Gateway. +- The Docker socket mount is required for services that start additional containers, such as Lambda. +- Docker reuses a local image if one already exists. Pull explicitly or pin an image tag, such as `localstack/localstack:`, when you need reproducible CI or team environments. +- If you use Docker bridge networking, container name resolution may not work as expected from other containers. Prefer the default LocalStack networking setup unless you have a specific reason to customize it. +- Configuration variables can be prefixed with `LOCALSTACK_` in Docker. For instance, setting `LOCALSTACK_PERSISTENCE=1` is equivalent to `PERSISTENCE=1`. +For more details, see the [Docker images](/aws/capabilities/config/docker-images/), [configuration](/aws/capabilities/config/configuration/), and [networking](/aws/capabilities/networking/) documentation. +::: + ### Helm (Kubernetes) Deploy LocalStack to a Kubernetes cluster: ```bash -helm repo add localstack-repo [https://helm.localstack.cloud](https://helm.localstack.cloud) +helm repo add localstack-repo https://helm.localstack.cloud helm upgrade --install localstack localstack-repo/localstack - ``` -## Graphical User Interfaces (GUIs) +## Graphical user interfaces (GUIs) ### LocalStack Desktop Manage local instances via a standalone desktop application. [Download here](https://app.localstack.cloud/download). -### Docker Desktop Extension - -Install the [official extension](https://hub.docker.com/extensions/localstack/localstack-docker-desktop) to manage LocalStack directly from the Docker Desktop dashboard. - +### Docker Desktop extension +Install the [official extension](https://hub.docker.com/extensions/localstack/localstack-docker-desktop) to manage LocalStack directly from the Docker Desktop. ## Troubleshooting @@ -348,7 +374,7 @@ Install the [official extension](https://hub.docker.com/extensions/localstack/lo If you can successfully install LocalStack using `pip` but you cannot use it in your terminal, you most likely haven't set up your operating system's / terminal's `PATH` variable (in order to tell them where to find programs installed via `pip`). - If you are using Windows, you can enable the `PATH` configuration when installing Python, [as described in the official docs of Python](https://docs.python.org/3/using/windows.html#finding-the-python-executable). -- If you are using a MacOS or Linux operating system, please make sure that the `PATH` is correctly set up - either system wide, or in your terminal. +- If you are using a macOS or Linux operating system, please make sure that the `PATH` is correctly set up - either system wide, or in your terminal. As a workaround you can call the LocalStack CLI python module directly: @@ -374,9 +400,18 @@ DNS_ADDRESS=0 localstack start You can now avail logging output and error reporting using LocalStack logs. To access the logs, run the following command: + + ```bash localstack logs ``` + + +```bash +lstk logs +``` + + AWS requests are now logged uniformly in the INFO log level (set by default or when `DEBUG=0`). The format is: @@ -412,7 +447,6 @@ We have extensive network troubleshooting documentation available [here](/aws/ca If this does not solve your problem then please [reach out to LocalStack Support](/aws/help-support/get-help/). - ## Next steps Now that you've completed installation, proceed to the [Local Development Guide](/aws/getting-started/local-development) to start LocalStack and deploy a serverless API. This guide walks you through deploying a Lambda function backed by a DynamoDB table entirely on your local machine. diff --git a/src/content/docs/aws/getting-started/local-development.mdx b/src/content/docs/aws/getting-started/local-development.mdx index ce7e9c35c..b0f1f1ce5 100644 --- a/src/content/docs/aws/getting-started/local-development.mdx +++ b/src/content/docs/aws/getting-started/local-development.mdx @@ -30,7 +30,7 @@ Choose your preferred deployment method: **Terraform** or **AWS CLI**. The `lstk` CLI provides the fastest initialization path by automating authentication and image management. - Ensure you have [installed](/aws/getting-started/installation/#install-lstk) `lstk` before starting LocalStack. + Ensure you have [installed](/aws/getting-started/installation/#lstk) `lstk` before starting LocalStack. Start LocalStack: From b5a040b2493e76f906b4bdd133c9d143ac55d8ed Mon Sep 17 00:00:00 2001 From: HarshCasper Date: Thu, 4 Jun 2026 01:33:33 +0530 Subject: [PATCH 27/58] Update auth token getting started guide --- .../docs/aws/getting-started/auth-token.mdx | 124 ++++++++++-------- 1 file changed, 71 insertions(+), 53 deletions(-) diff --git a/src/content/docs/aws/getting-started/auth-token.mdx b/src/content/docs/aws/getting-started/auth-token.mdx index 295f71c35..c74389e92 100644 --- a/src/content/docs/aws/getting-started/auth-token.mdx +++ b/src/content/docs/aws/getting-started/auth-token.mdx @@ -1,110 +1,125 @@ --- title: Auth Token -description: Configure and manage LocalStack Auth Tokens for local development and CI/CD environments. +description: Configure and manage your LocalStack Auth Token to activate LocalStack and access licensed features. template: doc sidebar: order: 3 --- -import { Code, Tabs, TabItem } from '@astrojs/starlight/components'; +import { Tabs, TabItem } from '@astrojs/starlight/components'; -The Auth Token is a mandatory credential required to pull the `localstack-pro` image and activate service entitlements. It links your local instance to your workspace license and enables access to the full suite of emulated AWS services. +## What is an Auth Token? -## Token Types +An Auth Token is a mandatory credential required to start the LocalStack container and activate licensed features. It links your running LocalStack instance to your workspace license and unlocks the services and capabilities available to your account. + +You can manage Auth Tokens from the [Auth Tokens page](https://app.localstack.cloud/workspace/auth-tokens) in the LocalStack Web Application. + +:::danger[Credential security] +Auth Tokens provide access to your license and workspace. Do not commit tokens to version control. If a token is exposed, rotate it immediately in the LocalStack Web Application. +::: + +## Token types | Token Type | Scope | Use Case | | :--- | :--- | :--- | | **Developer Token** | Individual | Local development workstations. Managed per user. | | **CI Auth Token** | Workspace | Automated pipelines and shared runners. Managed by workspace admins. | -Manage both token types on the [Auth Tokens page](https://app.localstack.cloud/workspace/auth-tokens) in the LocalStack Web Application. - -:::danger[Credential Security] -Auth Tokens provide full access to your license and workspace. **Do not commit tokens to version control.** If a token is exposed, rotate it immediately via the Web Application to invalidate existing sessions. -::: - -## Configuration Methods +## Configure your token Authentication requirements vary based on your chosen execution method. -### 1. lstk (Automated) +### lstk + The `lstk` CLI automates the authentication lifecycle. On initial execution, it triggers a browser-based OAuth flow and stores the resulting token in your system keyring. No manual environment variable configuration is required. ```bash lstk start - ``` -### 2. LocalStack CLI +### LocalStack CLI -If you use the standard CLI, set your token using the `auth` command. This persists the credential in your local configuration. +If you use the LocalStack CLI, set your token with the `auth` command. This stores the token in your local configuration. -### 3. Docker & Docker Compose +```bash +localstack auth set-token +localstack start +``` -For direct container execution, inject the token as an environment variable. +### Docker and Docker Compose + +For direct container execution, inject the token as an environment variable. For complete startup examples, see the [Docker Compose](/aws/getting-started/installation/#docker-compose) and [Docker CLI](/aws/getting-started/installation/#docker-cli) installation options. **Docker CLI:** ```bash -docker run \ - --rm -it \ - -e LOCALSTACK_AUTH_TOKEN=${LOCALSTACK_AUTH_TOKEN} \ - localstack/localstack-pro - +-e LOCALSTACK_AUTH_TOKEN=${LOCALSTACK_AUTH_TOKEN} ``` **Docker Compose:** ```yaml -services: - localstack: - image: localstack/localstack-pro - environment: - - LOCALSTACK_AUTH_TOKEN=${LOCALSTACK_AUTH_TOKEN} - +environment: + - LOCALSTACK_AUTH_TOKEN=${LOCALSTACK_AUTH_TOKEN} ``` -## License Assignment +### CI environments -An Auth Token is only valid if a license is assigned to your user identity or workspace. +CI environments should use a dedicated CI Auth Token stored in your CI provider's secret manager. +For complete examples, see the [CI/CD guide](/aws/getting-started/ci-cd/). -**Assignment Workflow:** +## Verify activation -1. Navigate to the [Users & Licenses page](https://app.localstack.cloud/workspace/members). -2. Identify the target user in **Workspace Members**. -3. Select the appropriate **Member Role** (Admins receive full permissions by default). -4. Save the configuration to activate the license for that identity. +Verify the activation status by querying the LocalStack info endpoint: -:::note -An active Auth Token will fail to initialize the container if a valid license has not been assigned to the associated user. -::: + + + ```bash + curl http://localhost:4566/_localstack/info | jq + ``` -## Activation Verification + + -Verify the activation status by querying the LocalStack info endpoint: + ```powershell + Invoke-WebRequest -Uri http://localhost:4566/_localstack/info | ConvertFrom-Json + ``` -**Successful Activation Output:** + + -```json +```json title="Output" { "edition": "pro", "is_license_activated": true } - ``` +The `edition` field should be `pro`, and `is_license_activated` should be `true`. -## Next steps +## License assignment -You have successfully completed the Getting Started sequence! -Proceed to the [FAQ](/aws/getting-started/faq/) for troubleshooting common scenarios, or explore our [supported local AWS services](/aws/services/) to begin building. +An Auth Token can only activate licensed features if a license is assigned to the associated user or workspace. +1. Navigate to the [Users & Licenses page](https://app.localstack.cloud/workspace/members). +2. Identify the target user in **Workspace Members**. +3. Select the appropriate **Member Role**. +4. Save the configuration to activate the license for that identity. + +:::note +LocalStack cannot activate licensed features unless the token belongs to a user or workspace with an assigned license. +::: + +## Rotate a token + +Rotate an Auth Token if it has been exposed, shared accidentally, or stored in a place where it should not be. Go to the [Auth Tokens page](https://app.localstack.cloud/workspace/auth-tokens) and select the reset option for the affected token. + +After rotation, update every local shell, container configuration, or CI secret that used the old token. ## Troubleshooting -While using Auth Tokens, LocalStack demands a successful license activation for startup. -If the activation of the license is unsuccessful, LocalStack will exit and display error messages. +LocalStack requires successful license activation during startup. If activation fails, LocalStack exits and displays an error message: ```bash =============================================== @@ -119,11 +134,11 @@ Due to this error, Localstack has quit. LocalStack for AWS features can only be - If you want to continue using LocalStack without pro features you can set `ACTIVATE_PRO=0`. ``` -The key activation in LocalStack may fail for several reasons, and the most common ones are listed below in this section. +Activation may fail for several reasons, and the most common ones are listed below. -### Missing Credentials +### Missing credentials -You need to provide either an Auth Token to start the LocalStack for AWS image successfully. +You need to provide an Auth Token to start the LocalStack for AWS image successfully. You can find your Auth Token on the [Auth Tokens page](https://app.localstack.cloud/workspace/auth-tokens) in the LocalStack Web Application. If you are using the `localstack` CLI, you can set the `LOCALSTACK_AUTH_TOKEN` environment variable to your Auth Token or use the following command to set it up: @@ -132,12 +147,12 @@ If you are using the `localstack` CLI, you can set the `LOCALSTACK_AUTH_TOKEN` e localstack auth set-token ``` -### Invalid License +### Invalid license The issue may occur if there is no valid license linked to your account due to expiration or if the license has not been assigned. You can check your license status in the LocalStack Web Application on the [My License page](https://app.localstack.cloud/workspace/my-license). -### License Server Unreachable +### License server unreachable LocalStack initiates offline activation when the license server is unreachable, requiring re-activation every 24 hours. Log output may indicate issues with your machine resolving the LocalStack API domain, which can be verified using a tool like `dig`: @@ -152,3 +167,6 @@ Kindly reach out to your network administrator to safelist `localstack.cloud` do If you have any further problems concerning your license activation, or if the steps do not help, don't hesitate to [contact us](https://localstack.cloud/contact/). +## Next steps + +After configuring your Auth Token, continue to the [Local Development guide](/aws/getting-started/local-development/) to start LocalStack and deploy a local serverless API. From 0475773dd20f40751507449c38a1bdb3ec2638d5 Mon Sep 17 00:00:00 2001 From: HarshCasper Date: Thu, 4 Jun 2026 01:58:44 +0530 Subject: [PATCH 28/58] Update AI workflows getting started guide --- .../docs/aws/getting-started/ai-workflows.mdx | 89 ++++++++++++++----- 1 file changed, 69 insertions(+), 20 deletions(-) diff --git a/src/content/docs/aws/getting-started/ai-workflows.mdx b/src/content/docs/aws/getting-started/ai-workflows.mdx index 911918adb..f5fb3c32f 100644 --- a/src/content/docs/aws/getting-started/ai-workflows.mdx +++ b/src/content/docs/aws/getting-started/ai-workflows.mdx @@ -1,43 +1,92 @@ --- title: AI & Agent Workflows -description: Integrate LocalStack with AI coding assistants, MCP servers, and agent-driven infrastructure automation. +description: Use LocalStack with AI coding assistants, MCP clients, and agent-driven infrastructure workflows. template: doc sidebar: order: 6 --- -LocalStack provides a secure, emulated environment for developing and testing AI-assisted workflows. You can iterate on AI-generated infrastructure code and agentic deployment tasks without incurring cloud costs or risking production AWS environments by using a local cloud sandbox. +## Introduction -## Capability Map +LocalStack gives AI coding assistants a local AWS-compatible environment to work against. Instead of letting an agent experiment in a real AWS account, you can ask it to create infrastructure, deploy code, inspect logs, and test resources in LocalStack first. -| Use Case | Recommended Tooling | -| :--- | :--- | -| **AI Assistant Resource Management** | [LocalStack MCP Server](/aws/tooling/mcp-server/) | -| **Autonomous Infrastructure Deployment** | [LocalStack Skills](https://github.com/localstack/skills) | -| **Local IaC Validation** | LocalStack + `tflocal` / `cdklocal` / `awslocal` | +This is useful when you want to: +- Prototype AWS applications & infrastructure code from natural language prompts. +- Validate AI-generated Terraform, CDK, or AWS CLI commands before using a cloud account. +- Give an AI assistant a safe place to inspect resources, debug logs, and iterate on deployments. +- Use reusable agent instructions for LocalStack-aware infrastructure workflows. -## Model Context Protocol (MCP) Integration +## Common workflows -The LocalStack MCP Server connects compatible AI clients (such as Claude, Cursor, or Windsurf) to your local cloud environment. This integration allows AI agents to manage the full local cloud lifecycle, including container management, resource deployment, and log analysis. +There are three common ways to use LocalStack in AI-assisted development: -:::note[Official MCP Documentation] -For detailed configuration instructions, prerequisite checks, and the complete tool reference, read our [LocalStack MCP Server guide](/aws/tooling/mcp-server/). You don't need to start LocalStack manually before using MCP; agents can initialize the container using the management tools provided by the server. +- Use the [LocalStack MCP Server](/aws/tooling/mcp-server/) when your AI assistant supports MCP clients such as Cursor, Claude, Codex, or OpenCode. +- Use [LocalStack Skills](https://github.com/localstack/skills) when you want reusable agent instructions for deploying and testing AWS architectures against LocalStack. +- Use LocalStack with `tflocal`, `cdklocal`, or `awslocal` when you want the agent to generate infrastructure code or commands that you review and run locally. + +You do not need all three approaches to get started. If your editor supports MCP, start with the LocalStack MCP Server. Or, you can use Skills if you want reusable agent instructions. If not, ask your assistant to generate Terraform, CDK, or AWS CLI steps and run them with LocalStack's local wrappers. + +## Connect an MCP client + +The LocalStack MCP Server connects MCP-compatible clients to your LocalStack environment. Once configured, your AI assistant can use LocalStack tools to start the container, deploy infrastructure, run AWS CLI commands, inspect logs, manage state, and query resources. + +:::note +The MCP server runs locally and talks to your LocalStack instance. Your AI assistant is the MCP client. For setup instructions and the full tool reference, see the [LocalStack MCP Server guide](/aws/tooling/mcp-server/). ::: +All MCP server tools require a valid [Auth Token](/aws/getting-started/auth-token/) configured as `LOCALSTACK_AUTH_TOKEN`. + +## Use agent skills + +[LocalStack Skills](https://github.com/localstack/skills) provide reusable instructions for AI agents working with LocalStack. They help agents follow LocalStack-specific conventions when creating infrastructure, deploying resources, running tests, and inspecting local cloud state. + +Skills are most useful when you want the assistant to follow a repeatable workflow, for example: + +- Scaffold a local AWS application and deploy it to LocalStack. +- Convert an AWS architecture idea into Terraform or CDK that targets LocalStack first. +- Debug a failing local deployment by checking resources, logs, and configuration. +- Save or restore LocalStack state as part of an iterative development loop. + +Refer to the [LocalStack Skills repository](https://github.com/localstack/skills) for available skills and setup instructions. + +## Example prompt sequence + +After LocalStack and your preferred AI tooling are configured, you can use a sequence like this: + +```text +Create a Terraform application with an S3 bucket, a Lambda function, and a DynamoDB table. +Make it deployable to LocalStack with tflocal. +``` + +```text +Deploy the application to LocalStack and fix any errors from the deployment. +``` + +```text +Invoke the Lambda function locally, inspect the DynamoDB table, and summarize what resources were created. +``` + +```text +Add an integration test that verifies the Lambda writes an item to DynamoDB. +Run the test against LocalStack. +``` -## Agent-Driven Automation with Skills +This keeps the feedback loop local while still giving the assistant a realistic AWS-compatible target. -[LocalStack Skills](https://github.com/localstack/skills) provide pre-defined agent skill definitions for automating AWS architecture deployments. These skills allow agents to scaffold environments, iterate on architecture designs, and manage LocalStack state autonomously. +## Review before applying to AWS -Skills implementation scenarios: -- **Rapid Prototyping**: Scaffold new local environments without manual infrastructure coding. -- **Agent-First Development**: Establish LocalStack as a primary deployment target for autonomous agents. -- **Architecture Iteration**: Test complex architectural changes in a risk-free, local sandbox. +AI-generated infrastructure still needs review. Treat LocalStack as the first validation step, not as a replacement for code review, tests, or production deployment controls. -Refer to the [LocalStack Skills repository](https://github.com/localstack/skills) for available skill definitions and setup instructions. +Before applying changes to AWS, check that: +- The generated infrastructure matches your intended architecture. +- Resource names, IAM policies, and environment variables are appropriate for your project. +- Tests pass against LocalStack. +- You understand any changes the assistant made to application code or deployment configuration. ## Next steps -You have explored the integration patterns for AI and agent-driven development. Proceed to the [Auth Token guide](/aws/getting-started/auth-token/) to configure your licensing and unlock advanced LocalStack features. +- Configure the [LocalStack MCP Server](/aws/tooling/mcp-server/) if your AI assistant supports MCP. +- Review [LocalStack Skills](https://github.com/localstack/skills) for reusable agent workflows. +- Continue with the [Local Development guide](/aws/getting-started/local-development/) if you want a guided Lambda and DynamoDB example before adding AI tooling. From 72e835633a8c5e4d09517ba7925113be6548e5ef Mon Sep 17 00:00:00 2001 From: HarshCasper Date: Thu, 4 Jun 2026 07:50:12 +0530 Subject: [PATCH 29/58] Update CI getting started guide --- .../docs/aws/getting-started/ci-cd.mdx | 251 +++++++++++------- 1 file changed, 148 insertions(+), 103 deletions(-) diff --git a/src/content/docs/aws/getting-started/ci-cd.mdx b/src/content/docs/aws/getting-started/ci-cd.mdx index 6c2671b0f..b12d27f49 100644 --- a/src/content/docs/aws/getting-started/ci-cd.mdx +++ b/src/content/docs/aws/getting-started/ci-cd.mdx @@ -1,6 +1,6 @@ --- -title: CI/CD Integration -description: Implementation guides for LocalStack in automated pipelines, including GitHub Actions, Docker Compose, and state management. +title: CI Integration +description: Use LocalStack in CI pipelines to run integration tests against local AWS infrastructure. template: doc sidebar: order: 5 @@ -8,145 +8,190 @@ sidebar: import { Tabs, TabItem } from '@astrojs/starlight/components'; -Integrating LocalStack into CI/CD environments enables automated integration testing without cloud infrastructure costs or vendor dependency. CI configurations differ from local development environments in authentication methods and startup workflows. +## Introduction -Key operational differences in CI/CD include: -- **Authentication**: Use a dedicated CI Auth Token instead of a personal Developer token. -- **Initialization**: Execute LocalStack in non-interactive mode using Docker Compose, the Docker CLI, or specialized CI actions. -- **Isolation**: Initialize a fresh LocalStack instance for each job to ensure reproducible test results. -- **State Management**: Utilize Cloud Pods or state export/import commands to persist infrastructure across pipeline stages. +LocalStack helps you run integration tests in CI against emulated AWS infrastructure. Your pipeline starts LocalStack inside the CI job, deploys or prepares the resources your application needs, runs tests against the local endpoint, and then discards the environment when the job ends. -## Step 1: Configure CI Auth Token +## How LocalStack works in CI -Dedicated CI Auth Tokens are required for automated environments to ensure security and auditability. +A typical CI job with LocalStack follows this flow: -1. Navigate to the [Auth Tokens page](https://app.localstack.cloud/workspace/auth-tokens) in the LocalStack Web Application. -2. Generate a new **CI Auth Token**. -3. Store the token as a protected secret within your CI provider (e.g., `LOCALSTACK_AUTH_TOKEN`). +1. Check out your application code. +2. Start LocalStack in the CI runner. +3. Configure a CI Auth Token through the CI provider's secret manager. +4. Deploy test infrastructure with tools such as `awslocal`, `tflocal`, `cdklocal`, or your application's test harness. +5. Run integration tests against the LocalStack endpoint. +6. Collect logs, test reports, and artifacts from the job. -:::danger[Security Best Practice] -Never commit your auth tokens to source control. -Always inject tokens via your CI provider's secrets or environment variable system. -Rotate compromised tokens immediately via the Web Application. Old tokens are invalidated instantly. -::: +This gives every pipeline run a fresh AWS-compatible environment without creating cloud resources in an AWS account. -:::note -Read the [Auth Token guide](/aws/getting-started/auth-token/) for full details on token types and configuration. -::: +## What changes from local development -## Step 2: Start LocalStack in CI +CI runs are usually more constrained than local development: -Select the integration method compatible with your CI runner architecture. +- Use a dedicated **CI Auth Token** instead of a personal Developer Token. +- Store `LOCALSTACK_AUTH_TOKEN` as a protected CI secret. +- Start LocalStack non-interactively as part of the job. +- Treat the LocalStack container as ephemeral unless your workflow explicitly saves state. +- Export logs and test reports before the runner shuts down. + +Docker and Docker Compose are still common ways to run containers inside CI runners, but they are not CI tools by themselves. For container startup details, see the [Installation guide](/aws/getting-started/installation/#container-and-orchestration-tools). For provider-specific CI setup, use the integration guides below. + +## Choose your CI provider + +Start with the CI system you use. These snippets show the basic LocalStack startup shape for each provider; the linked guides include authentication, configuration, logs, state management, and provider-specific caveats. - Use the official GitHub Action to initialize LocalStack as a workflow step: ```yaml - # .github/workflows/integration-tests.yml - name: Integration Tests - on: [push, pull_request] + - name: Start LocalStack + uses: LocalStack/setup-localstack@main + with: + image-tag: 'latest' + install-awslocal: 'true' + env: + LOCALSTACK_AUTH_TOKEN: ${{ secrets.LOCALSTACK_AUTH_TOKEN }} + ``` + See the [GitHub Actions guide](/aws/integrations/continuous-integration/github-actions/) for the full setup. + + + + + ```yaml + version: '2.1' + orbs: + python: circleci/python@4.0.0 jobs: - test: - runs-on: ubuntu-latest + localstack-test: + machine: + image: ubuntu-2204:current steps: - - uses: actions/checkout@v4 - - - name: Start LocalStack - uses: LocalStack/setup-localstack@v0.2.2 - with: - image-tag: latest - install-awslocal: "true" - env: - LOCALSTACK_AUTH_TOKEN: ${{ secrets.LOCALSTACK_AUTH_TOKEN }} - - - name: Run tests - run: | - # Your test commands here, e.g.: - pip install awscli-local - awslocal s3 mb s3://integration-test-bucket - pytest tests/integration/ + - checkout + - run: + name: Install LocalStack CLI and awslocal + command: | + python3 -m pip install --user --upgrade pip + python3 -m pip install --user localstack awscli-local[ver1] + echo 'export PATH=$HOME/.local/bin:$PATH' >> "$BASH_ENV" + - run: + name: Start LocalStack + command: | + source "$BASH_ENV" + docker pull localstack/localstack:latest + localstack start -d + localstack wait -t 60 ``` - The `setup-localstack` action pulls the image, starts the container, and waits for LocalStack to be ready. + + See the [CircleCI guide](/aws/integrations/continuous-integration/circleci/) for the full setup. - - - Define LocalStack as a service in your `docker-compose.yml` for containerized environments: + ```yaml - services: - localstack: - container_name: localstack-main - image: localstack/localstack-pro - ports: - - "127.0.0.1:4566:4566" - - "127.0.0.1:4510-4559:4510-4559" - environment: - - LOCALSTACK_AUTH_TOKEN=${LOCALSTACK_AUTH_TOKEN:?} - volumes: - - "/var/run/docker.sock:/var/run/docker.sock" + image: python:3.9 + + definitions: + services: + docker: + memory: 2048 + + pipelines: + default: + - step: + name: Test LocalStack + services: + - docker + script: + - export DOCKER_SOCK=$DOCKER_HOST + - export AWS_ENDPOINT_URL="http://localhost.localstack.cloud:4566" + - echo "${BITBUCKET_DOCKER_HOST_INTERNAL} localhost.localstack.cloud " >> /etc/hosts + - pip install localstack awscli-local + - docker run -d --rm -p 4566:4566 -p 4510-4559:4510-4559 -e DOCKER_SOCK=tcp://${BITBUCKET_DOCKER_HOST_INTERNAL}:2375 -e DOCKER_HOST=tcp://${BITBUCKET_DOCKER_HOST_INTERNAL}:2375 --name localstack-main localstack/localstack + - localstack wait -t 60 ``` - Start the service and verify readiness before executing tests: + See the [Bitbucket Pipelines guide](/aws/integrations/continuous-integration/bitbucket/) for the full setup. + + + - ```bash - docker compose up -d localstack - # Wait for LocalStack to be ready - until curl -s http://localhost:4566/_localstack/health | grep -q '"running"'; do sleep 1; done + ```yaml + version: 0.2 + + phases: + pre_build: + commands: + - pip3 install localstack awscli + - docker pull public.ecr.aws/localstack/localstack:latest + - localstack start -d + - localstack wait -t 30 ``` - :::note - Mounting `/var/run/docker.sock` is required for Lambda emulation, which uses Docker to run function containers. - ::: + See the [CodeBuild guide](/aws/integrations/continuous-integration/codebuild/) for the full setup. + + + ```yaml + variables: + DOCKER_SOCK: tcp://docker:2375 + DOCKER_HOST: tcp://docker:2375 + DOCKER_TLS_CERTDIR: "" - - Initialize the container directly using the Docker engine: - - ```bash - docker run \ - --rm -d \ - --name localstack-main \ - -p 127.0.0.1:4566:4566 \ - -p 127.0.0.1:4510-4559:4510-4559 \ - -e LOCALSTACK_AUTH_TOKEN=${LOCALSTACK_AUTH_TOKEN:?} \ - -v /var/run/docker.sock:/var/run/docker.sock \ - localstack/localstack-pro - - # Wait for readiness - until curl -s http://localhost:4566/_localstack/health | grep -q '"running"'; do sleep 1; done + services: + - name: localstack/localstack:latest + alias: localstack + - name: docker:dind + alias: docker + command: ["--tls=false"] ``` + + See the [GitLab CI guide](/aws/integrations/continuous-integration/gitlab-ci/) for the full setup. + + + + + ```yaml + language: python + + services: + - docker + + python: + - "3.8" + + before_install: + - python -m pip install localstack awscli-local[ver1] + - docker pull localstack/localstack + - localstack start -d + - localstack wait -t 30 + ``` + + See the [Travis CI guide](/aws/integrations/continuous-integration/travis-ci/) for the full setup. + -## Technical Comparison: Local vs. CI/CD +You can also start from the [CI integrations overview](/aws/integrations/continuous-integration/) if you want a broader explanation of the CI workflow. -| Feature | Local Development | CI/CD Environment | -| :--- | :--- | :--- | -| **Interface** | `lstk` or LocalStack CLI | Docker Compose / `docker run`, or `lstk --non-interactive` | -| **Authentication** | Browser-based or stored credentials | `LOCALSTACK_AUTH_TOKEN` environment variable | -| **Token Type** | Individual Developer Token | Dedicated CI Token | -| **State** | Persistent by choice | Ephemeral (standard) or Snapshotted (Cloud Pods) | -| **Startup Mode** | Interactive (TUI) (default `lstk`) | Non-interactive (Headless) (`docker compose`, `docker run -d`, `lstk --non-interactive`) | +## Authentication in CI -## State Persistence in CI +CI environments should use a CI Auth Token. Create one from the [Auth Tokens page](https://app.localstack.cloud/workspace/auth-tokens), then store it as `LOCALSTACK_AUTH_TOKEN` in your CI provider's secret manager. -While most pipelines favor ephemeral instances for clean test cycles, certain workflows require persisting infrastructure state across jobs or runners. +Do not commit tokens to your repository or write them directly into workflow files. For more details on token types and rotation, see the [Auth Token guide](/aws/getting-started/auth-token/). -- **[Cloud Pods](/aws/capabilities/state-management/cloud-pods/)**: Save or load snapshots using the `setup-localstack` action with the `state-backend: cloud-pods` configuration. -- **Snapshot Persistence Engine**: Enable `PERSISTENCE=1` and mount a host volume to retain data across container restarts on the same runner. -- **State Export/Import Commands**: Use `localstack state export` and `localstack state import` to pass infrastructure state via CI artifacts or caching mechanisms. +## State in CI -## Next steps +Most CI jobs should start with a clean LocalStack instance. A fresh instance makes test runs reproducible and avoids hidden dependencies between jobs. + +If your pipeline needs state across jobs or workflow stages, use one of the state management options documented outside this getting started page: -You have configured LocalStack for automated environments and explored various CI/CD integration patterns. Proceed to the [AI & Agent Workflows Guide](/aws/getting-started/ai-workflows/) to learn how to integrate LocalStack with AI coding assistants and automate infrastructure tasks. +- [Cloud Pods](/aws/capabilities/state-management/cloud-pods/) to save and restore named LocalStack state snapshots. +- [State export and import](/aws/capabilities/state-management/export-import-state/) to move state through artifacts or caches. +- [Persistence](/aws/capabilities/state-management/persistence/) when the same runner keeps a mounted LocalStack volume. -## Resources +## Next steps -- [GitHub Actions Integration](/aws/integrations/continuous-integration/github-actions/): Advanced workflows and configuration options. -- [CircleCI Guide](/aws/integrations/continuous-integration/circleci/): Implementation details for CircleCI environments. -- [GitLab CI Integration](/aws/integrations/continuous-integration/gitlab-ci/): Service-based setup for GitLab runners. -- [AWS CodeBuild](/aws/integrations/continuous-integration/codebuild/): Native AWS CI/CD integration. +After choosing your CI provider, continue with the matching integration guide and adapt the example to your test framework, infrastructure tooling, and CI runner model. From 96a03c6b0e8c1c8ddd74cf9946d069f2ca50618c Mon Sep 17 00:00:00 2001 From: HarshCasper Date: Thu, 4 Jun 2026 07:55:10 +0530 Subject: [PATCH 30/58] Fix getting started sidebar order --- src/content/docs/aws/getting-started/installation.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/aws/getting-started/installation.mdx b/src/content/docs/aws/getting-started/installation.mdx index 116053d8f..962817cd0 100644 --- a/src/content/docs/aws/getting-started/installation.mdx +++ b/src/content/docs/aws/getting-started/installation.mdx @@ -3,7 +3,7 @@ title: Installation description: Install LocalStack with lstk, the LocalStack CLI, Docker, Docker Compose, or Helm. template: doc sidebar: - order: 3 + order: 2 --- import { Code, LinkButton, Tabs, TabItem } from '@astrojs/starlight/components'; From 75b4bbd5e34626ff0d17fba55da9fd37f829f513 Mon Sep 17 00:00:00 2001 From: HarshCasper Date: Thu, 4 Jun 2026 08:10:33 +0530 Subject: [PATCH 31/58] Update getting started onboarding --- .../docs/aws/getting-started/index.mdx | 22 ++++++++++++++----- .../docs/aws/getting-started/installation.mdx | 2 ++ 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/content/docs/aws/getting-started/index.mdx b/src/content/docs/aws/getting-started/index.mdx index a639c333b..503b8b51c 100644 --- a/src/content/docs/aws/getting-started/index.mdx +++ b/src/content/docs/aws/getting-started/index.mdx @@ -20,20 +20,32 @@ LocalStack provides a cloud service emulator that runs within a single container LocalStack also provides advanced features for team collaboration and security, including [Cloud Pods](/aws/capabilities/state-management/cloud-pods/) for state management, [IAM policy enforcement](/aws/capabilities/security-testing/iam-policy-enforcement/), and [Chaos Engineering](/aws/capabilities/chaos-engineering/). -## Explore by deployment +## Start with the basics diff --git a/src/content/docs/aws/getting-started/installation.mdx b/src/content/docs/aws/getting-started/installation.mdx index 962817cd0..7d260f0d6 100644 --- a/src/content/docs/aws/getting-started/installation.mdx +++ b/src/content/docs/aws/getting-started/installation.mdx @@ -15,6 +15,8 @@ LocalStack provides multiple installation paths depending on your development en Choose the CLI that fits your workflow: use [`lstk`](#lstk) to install, authenticate, and start LocalStack with minimal setup, or use the [LocalStack CLI](#localstack-cli) when you need full-featured management commands for advanced workflows. +LocalStack for AWS features require an [Auth Token](/aws/getting-started/auth-token/) to activate your running instance. `lstk` handles authentication through a browser-based login flow, while the LocalStack CLI, Docker, and CI workflows can use `LOCALSTACK_AUTH_TOKEN`. + ## lstk `lstk` is a lightweight CLI for LocalStack that manages the authentication and container lifecycle in a single workflow. From 54f0ca872f7f5dde1e35956a434892ec6daf9a92 Mon Sep 17 00:00:00 2001 From: HarshCasper Date: Thu, 4 Jun 2026 08:11:16 +0530 Subject: [PATCH 32/58] Add getting started FAQ card --- src/content/docs/aws/getting-started/index.mdx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/content/docs/aws/getting-started/index.mdx b/src/content/docs/aws/getting-started/index.mdx index 503b8b51c..8b8b78ca0 100644 --- a/src/content/docs/aws/getting-started/index.mdx +++ b/src/content/docs/aws/getting-started/index.mdx @@ -53,6 +53,12 @@ LocalStack also provides advanced features for team collaboration and security, description: 'Integrate LocalStack with AI coding assistants via MCP or automate infrastructure tasks using LocalStack Skills.', href: '/aws/getting-started/ai-workflows/', + }, + { + title: 'FAQ', + description: + 'Frequently asked questions about LocalStack for AWS.', + href: '/aws/getting-started/faq/', } ]} client:load From b71518188c17eb8bed234adcf7fb9391030e65ea Mon Sep 17 00:00:00 2001 From: HarshCasper Date: Thu, 4 Jun 2026 09:27:48 +0530 Subject: [PATCH 33/58] simplify getting started --- src/content/docs/aws/getting-started/local-development.mdx | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/content/docs/aws/getting-started/local-development.mdx b/src/content/docs/aws/getting-started/local-development.mdx index b0f1f1ce5..3db38ede5 100644 --- a/src/content/docs/aws/getting-started/local-development.mdx +++ b/src/content/docs/aws/getting-started/local-development.mdx @@ -25,13 +25,12 @@ Choose your preferred deployment method: **Terraform** or **AWS CLI**. - A [LocalStack account](https://app.localstack.cloud/sign-up) and a valid [LocalStack Auth Token](/aws/getting-started/auth-token/). - Either [Terraform CLI](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli) or [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) installed, depending on your preferred deployment method. +If you haven't installed LocalStack yet, follow the [installation guide](/aws/getting-started/installation/) to get started. + ## Step 1: Install and Start LocalStack - The `lstk` CLI provides the fastest initialization path by automating authentication and image management. - Ensure you have [installed](/aws/getting-started/installation/#lstk) `lstk` before starting LocalStack. - Start LocalStack: ```bash @@ -56,8 +55,6 @@ Choose your preferred deployment method: **Terraform** or **AWS CLI**. - If you are using the full-featured LocalStack CLI, ensure you have [installed](/aws/getting-started/installation/#install-localstack-cli) it and [configured your auth token](/aws/getting-started/auth-token/) before starting: - Start LocalStack: ```bash From 2bb60a278e988932bf4e1e0fc663af86f85958ae Mon Sep 17 00:00:00 2001 From: HarshCasper Date: Thu, 4 Jun 2026 09:58:41 +0530 Subject: [PATCH 34/58] Fix quickstart redirects --- public/_redirects | 6 ++++-- scripts/redirects/redirects_config.json | 7 ++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/public/_redirects b/public/_redirects index b53bb1d96..3b0b4a7a5 100644 --- a/public/_redirects +++ b/public/_redirects @@ -397,7 +397,8 @@ /tutorials/replicate-aws-resources-localstack-extension/ /aws/tutorials/replicate-aws-resources-localstack-extension 301 /user-guide/tools/localstack-sdk/python/ /aws/tooling/localstack-sdks/python 301 /user-guide/lambda-tools/hot-reloading/ /aws/tooling/lambda-tools/hot-reloading 301 -/getting-started/quickstart/ /aws/getting-started/quickstart 301 +/getting-started/quickstart/ /aws/getting-started/local-development/ 301 +/aws/getting-started/quickstart/ /aws/getting-started/local-development/ 301 /overview/ /aws 301 /user-guide/aws/glue/ /aws/services/glue 301 /getting-started/ /aws/getting-started 301 @@ -804,7 +805,8 @@ /tutorials/replicate-aws-resources-localstack-extension /aws/tutorials/replicate-aws-resources-localstack-extension 301 /user-guide/tools/localstack-sdk/python /aws/tooling/localstack-sdks/python 301 /user-guide/lambda-tools/hot-reloading /aws/tooling/lambda-tools/hot-reloading 301 -/getting-started/quickstart /aws/getting-started/quickstart 301 +/getting-started/quickstart /aws/getting-started/local-development/ 301 +/aws/getting-started/quickstart /aws/getting-started/local-development/ 301 /overview /aws 301 /user-guide/aws/glue /aws/services/glue 301 /getting-started /aws/getting-started 301 diff --git a/scripts/redirects/redirects_config.json b/scripts/redirects/redirects_config.json index 6f3580563..6ed8fdf08 100644 --- a/scripts/redirects/redirects_config.json +++ b/scripts/redirects/redirects_config.json @@ -1975,7 +1975,12 @@ }, { "old_link": "/getting-started/quickstart/", - "new_link": "/aws/getting-started/quickstart", + "new_link": "/aws/getting-started/local-development/", + "status_code": 301 + }, + { + "old_link": "/aws/getting-started/quickstart/", + "new_link": "/aws/getting-started/local-development/", "status_code": 301 }, { From c1c86b5004786a77366c9dbeb50b556009c40287 Mon Sep 17 00:00:00 2001 From: HarshCasper Date: Thu, 4 Jun 2026 10:05:24 +0530 Subject: [PATCH 35/58] Fix getting started next steps --- src/content/docs/aws/getting-started/ai-workflows.mdx | 2 +- src/content/docs/aws/getting-started/ci-cd.mdx | 2 +- src/content/docs/aws/getting-started/installation.mdx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/content/docs/aws/getting-started/ai-workflows.mdx b/src/content/docs/aws/getting-started/ai-workflows.mdx index f5fb3c32f..2150c4527 100644 --- a/src/content/docs/aws/getting-started/ai-workflows.mdx +++ b/src/content/docs/aws/getting-started/ai-workflows.mdx @@ -89,4 +89,4 @@ Before applying changes to AWS, check that: - Configure the [LocalStack MCP Server](/aws/tooling/mcp-server/) if your AI assistant supports MCP. - Review [LocalStack Skills](https://github.com/localstack/skills) for reusable agent workflows. -- Continue with the [Local Development guide](/aws/getting-started/local-development/) if you want a guided Lambda and DynamoDB example before adding AI tooling. +- Browse the [LocalStack for AWS services](/aws/services/) reference, or check the [Getting Started FAQ](/aws/getting-started/faq/) for common setup questions. diff --git a/src/content/docs/aws/getting-started/ci-cd.mdx b/src/content/docs/aws/getting-started/ci-cd.mdx index b12d27f49..1e338aba7 100644 --- a/src/content/docs/aws/getting-started/ci-cd.mdx +++ b/src/content/docs/aws/getting-started/ci-cd.mdx @@ -194,4 +194,4 @@ If your pipeline needs state across jobs or workflow stages, use one of the stat ## Next steps -After choosing your CI provider, continue with the matching integration guide and adapt the example to your test framework, infrastructure tooling, and CI runner model. +After choosing your CI provider, continue to [AI & Agent Workflows](/aws/getting-started/ai-workflows/) to learn how AI coding assistants can help generate, deploy, and test LocalStack-backed AWS applications. diff --git a/src/content/docs/aws/getting-started/installation.mdx b/src/content/docs/aws/getting-started/installation.mdx index 4d08b2b8b..49f367a01 100644 --- a/src/content/docs/aws/getting-started/installation.mdx +++ b/src/content/docs/aws/getting-started/installation.mdx @@ -451,4 +451,4 @@ If this does not solve your problem then please [reach out to LocalStack Support ## Next steps -Now that you've completed installation, proceed to the [Local Development Guide](/aws/getting-started/local-development) to start LocalStack and deploy a serverless API. This guide walks you through deploying a Lambda function backed by a DynamoDB table entirely on your local machine. +Now that you've completed installation, proceed to the [Auth Token guide](/aws/getting-started/auth-token/) to activate LocalStack and prepare your environment for local development. From f7541a7e7fc6787d03902a555a04168d17405785 Mon Sep 17 00:00:00 2001 From: HarshCasper Date: Thu, 4 Jun 2026 10:47:31 +0530 Subject: [PATCH 36/58] some minor changes --- .../docs/aws/getting-started/ci-cd.mdx | 16 ++++++- .../docs/aws/getting-started/index.mdx | 2 +- .../aws/getting-started/local-development.mdx | 43 ++++++++++--------- 3 files changed, 39 insertions(+), 22 deletions(-) diff --git a/src/content/docs/aws/getting-started/ci-cd.mdx b/src/content/docs/aws/getting-started/ci-cd.mdx index 1e338aba7..ca28e3d25 100644 --- a/src/content/docs/aws/getting-started/ci-cd.mdx +++ b/src/content/docs/aws/getting-started/ci-cd.mdx @@ -41,6 +41,10 @@ Docker and Docker Compose are still common ways to run containers inside CI runn Start with the CI system you use. These snippets show the basic LocalStack startup shape for each provider; the linked guides include authentication, configuration, logs, state management, and provider-specific caveats. +:::note +For brevity, these snippets show only the LocalStack startup shape. Apart from the GitHub Actions example, they assume your CI Auth Token is already exposed to the job as the `LOCALSTACK_AUTH_TOKEN` environment variable. Store it as a secret in your CI provider before running them, and see [Authentication in CI](#authentication-in-ci) below. +::: + @@ -135,10 +139,13 @@ Start with the CI system you use. These snippets show the basic LocalStack start ```yaml + stages: + - test + variables: - DOCKER_SOCK: tcp://docker:2375 DOCKER_HOST: tcp://docker:2375 DOCKER_TLS_CERTDIR: "" + LOCALSTACK_HOST: "localstack:4566" services: - name: localstack/localstack:latest @@ -146,6 +153,13 @@ Start with the CI system you use. These snippets show the basic LocalStack start - name: docker:dind alias: docker command: ["--tls=false"] + + localstack-test: + stage: test + image: python:3.11 + script: + - pip install awscli-local + - awslocal s3 mb s3://test-bucket ``` See the [GitLab CI guide](/aws/integrations/continuous-integration/gitlab-ci/) for the full setup. diff --git a/src/content/docs/aws/getting-started/index.mdx b/src/content/docs/aws/getting-started/index.mdx index 8b8b78ca0..68be6a723 100644 --- a/src/content/docs/aws/getting-started/index.mdx +++ b/src/content/docs/aws/getting-started/index.mdx @@ -65,5 +65,5 @@ LocalStack also provides advanced features for team collaboration and security, /> :::note -**Enterprise K8 Deployment:** LocalStack also supports execution within Kubernetes clusters via the Operator or Helm charts. This model enables dynamic scaling, environment isolation, and native orchestration. See our [Kubernetes Deployment guide](/aws/enterprise/kubernetes/) for more information. +**Enterprise Kubernetes Deployment:** LocalStack also supports execution within Kubernetes clusters via the Operator or Helm charts. This model enables dynamic scaling, environment isolation, and native orchestration. See our [Kubernetes Deployment guide](/aws/enterprise/kubernetes/) for more information. ::: diff --git a/src/content/docs/aws/getting-started/local-development.mdx b/src/content/docs/aws/getting-started/local-development.mdx index 3db38ede5..2f099b807 100644 --- a/src/content/docs/aws/getting-started/local-development.mdx +++ b/src/content/docs/aws/getting-started/local-development.mdx @@ -6,7 +6,8 @@ sidebar: order: 4 --- -import { Tabs, TabItem, Steps } from '@astrojs/starlight/components'; +import { Code, Tabs, TabItem, Steps } from '@astrojs/starlight/components'; +import { LOCALSTACK_AWS_VERSION } from 'astro:env/server'; ## Introduction @@ -27,7 +28,7 @@ Choose your preferred deployment method: **Terraform** or **AWS CLI**. If you haven't installed LocalStack yet, follow the [installation guide](/aws/getting-started/installation/) to get started. -## Step 1: Install and Start LocalStack +## Step 1: Install and start LocalStack @@ -63,26 +64,28 @@ If you haven't installed LocalStack yet, follow the [installation guide](/aws/ge When the container is ready, you'll see these log lines: - ```bash - __ _______ __ __ - / / ____ _________ _/ / ___// /_____ ______/ /__ - / / / __ \/ ___/ __ `/ /\__ \/ __/ __ `/ ___/ //_/ - / /___/ /_/ / /__/ /_/ / /___/ / /_/ /_/ / /__/ ,< - /_____/\____/\___/\__,_/_//____/\__/\__,_/\___/_/|_| - - - LocalStack CLI: 2026.5.1 - - Profile: default - - App: https://app.localstack.cloud - - [14:37:38] starting LocalStack in Docker mode 🐳 localstack.py:542 - ... - Ready. - ``` + {/* prettier-ignore */} + -## Step 2: Deploy the Serverless API +## Step 2: Deploy the serverless API You can deploy the Lambda function and DynamoDB table using either our AWS CLI wrapper `awslocal` or our Terraform wrapper `tflocal`. These tools automatically route AWS API calls to your LocalStack container, so you do not need AWS account credentials for this guide. @@ -281,14 +284,14 @@ curl "$LAMBDA_URL" The Lambda function executes within the local environment and interacts with the locally emulated DynamoDB service. Because no actual cloud resources are created, you won't incur any real AWS cloud costs or infrastructure changes. -## Step 4: Inspect Resources +## Step 4: Inspect resources View the state of your local infrastructure via the [LocalStack Web Application](https://app.localstack.cloud/). Navigate to the [Resource Browser](https://app.localstack.cloud/inst/default/status) to inspect your Lambda functions and DynamoDB tables in real-time. ![Inspect Resources using LocalStack Web Application](/images/aws/localstack-resource-browser.png) -## Step 5: Clean Up +## Step 5: Clean up Stop your LocalStack container to remove all emulated resources. LocalStack is ephemeral by default; stopping the instance clears the state. From 60eed52ea6edaa09ba58b9bf6e9288bf3d6d788d Mon Sep 17 00:00:00 2001 From: HarshCasper Date: Thu, 4 Jun 2026 11:00:46 +0530 Subject: [PATCH 37/58] fix macos installation commands --- .../docs/aws/getting-started/installation.mdx | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/content/docs/aws/getting-started/installation.mdx b/src/content/docs/aws/getting-started/installation.mdx index 49f367a01..d515d2059 100644 --- a/src/content/docs/aws/getting-started/installation.mdx +++ b/src/content/docs/aws/getting-started/installation.mdx @@ -138,7 +138,7 @@ brew install localstack/tap/localstack-cli

Alternative: Binary Download -You may download the binary for your architecture using the link below: +You may download the binary for your architecture using the links below: Intel (AMD64) + + Apple Silicon (ARM64) + + +or use the curl commands below: + +For Intel (AMD64): + + -or use the following curl command: +For Apple Silicon (ARM64): From c394d48eac4ae7a011864b0a5cb9741416f11d80 Mon Sep 17 00:00:00 2001 From: Quetzalli Date: Sun, 28 Jun 2026 21:51:57 +0200 Subject: [PATCH 38/58] removed localstack cli mentions + moved auth token doc to order 6 --- .../docs/aws/getting-started/ai-workflows.mdx | 2 +- .../docs/aws/getting-started/auth-token.mdx | 2 +- .../docs/aws/getting-started/ci-cd.mdx | 4 +- src/content/docs/aws/getting-started/faq.mdx | 39 --- .../docs/aws/getting-started/index.mdx | 2 +- .../docs/aws/getting-started/installation.mdx | 286 +----------------- .../aws/getting-started/local-development.mdx | 43 +-- 7 files changed, 12 insertions(+), 366 deletions(-) diff --git a/src/content/docs/aws/getting-started/ai-workflows.mdx b/src/content/docs/aws/getting-started/ai-workflows.mdx index 2150c4527..a8d48e040 100644 --- a/src/content/docs/aws/getting-started/ai-workflows.mdx +++ b/src/content/docs/aws/getting-started/ai-workflows.mdx @@ -3,7 +3,7 @@ title: AI & Agent Workflows description: Use LocalStack with AI coding assistants, MCP clients, and agent-driven infrastructure workflows. template: doc sidebar: - order: 6 + order: 5 --- ## Introduction diff --git a/src/content/docs/aws/getting-started/auth-token.mdx b/src/content/docs/aws/getting-started/auth-token.mdx index c74389e92..e69185441 100644 --- a/src/content/docs/aws/getting-started/auth-token.mdx +++ b/src/content/docs/aws/getting-started/auth-token.mdx @@ -3,7 +3,7 @@ title: Auth Token description: Configure and manage your LocalStack Auth Token to activate LocalStack and access licensed features. template: doc sidebar: - order: 3 + order: 6 --- import { Tabs, TabItem } from '@astrojs/starlight/components'; diff --git a/src/content/docs/aws/getting-started/ci-cd.mdx b/src/content/docs/aws/getting-started/ci-cd.mdx index ca28e3d25..b3dacb0ef 100644 --- a/src/content/docs/aws/getting-started/ci-cd.mdx +++ b/src/content/docs/aws/getting-started/ci-cd.mdx @@ -3,7 +3,7 @@ title: CI Integration description: Use LocalStack in CI pipelines to run integration tests against local AWS infrastructure. template: doc sidebar: - order: 5 + order: 4 --- import { Tabs, TabItem } from '@astrojs/starlight/components'; @@ -74,7 +74,7 @@ For brevity, these snippets show only the LocalStack startup shape. Apart from t steps: - checkout - run: - name: Install LocalStack CLI and awslocal + name: Install lstk and awslocal command: | python3 -m pip install --user --upgrade pip python3 -m pip install --user localstack awscli-local[ver1] diff --git a/src/content/docs/aws/getting-started/faq.mdx b/src/content/docs/aws/getting-started/faq.mdx index 150917e85..e77069ac4 100644 --- a/src/content/docs/aws/getting-started/faq.mdx +++ b/src/content/docs/aws/getting-started/faq.mdx @@ -35,20 +35,6 @@ To resolve the issue follow the steps: For other SSL-related issues encountered during startup — such as Python `CERTIFICATE_VERIFY_FAILED` tracebacks or corporate TLS interception — see [How do I diagnose if my SSL traffic is being intercepted by a corporate proxy?](#how-do-i-diagnose-if-my-ssl-traffic-is-being-intercepted-by-a-corporate-proxy). -### How to update my LocalStack CLI? - -If the LocalStack CLI version is heavily outdated, it might lead to issues with container startup and debug commands. -If you are using an older version of LocalStack, you can update it by running the following command: - -```bash -pip install --upgrade localstack localstack-ext -``` - -If you are running a newer version of LocalStack, you can check the version by running the following command: - -```bash -localstack update localstack-cli -``` ### Is using `localhost.localstack.cloud:4566` to set as the endpoint for AWS services recommended? @@ -123,23 +109,6 @@ aws ssm put-parameter --name "//test/parameter/new" --type String --value "test" For additional known issues related to Git Bash, you can refer to the following link: [Git Bash Known Issues](https://github.com/git-for-windows/build-extra/blob/main/ReleaseNotes.md#known-issues) -### How to fix LocalStack CLI (Python) UTF-8 encoding issue under Windows? - -If you are using LocalStack CLI under Windows, you might run into encoding issues. -To fix this, set the following environment variables: -Set the system locale (language for non-Unicode programs) to UTF-8 to avoid Unicode errors. - -Follow these steps: - -- Open the Control Panel. -- Go to "Clock and Region" or "Region and Language." -- Click on the "Administrative" tab. -- Click on the "Change system locale" button. -- Select "Beta: Use Unicode UTF-8 for worldwide language support" and click "OK." -- Restart your computer to apply the changes. - -If you would like to keep the system locale as it is, you can mitigate the issue by using the command `localstack --no-banner`. - ### How do I resolve connection issues with proxy blocking access to LocalStack's BigData image? A company proxy can lead to connection issues. @@ -633,14 +602,6 @@ volumes: - "./license.json:/var/lib/localstack/cache/license.json:ro" ``` -### Why does LocalStack startup fail with "Docker not available"? - -The LocalStack CLI cannot reach the Docker daemon. Common fixes: - -- Start Docker Desktop and confirm it's running. -- Verify `docker ps` works as your current user (no `sudo`). -- On macOS, check that `/var/run/docker.sock` is reachable from Docker Desktop. -- If you use Colima, Rancher, or Podman, make sure the `DOCKER_HOST` environment variable points at the correct socket. ### Why does LocalStack fail with "ports are not available: exposing port TCP 127.0.0.1:443"? diff --git a/src/content/docs/aws/getting-started/index.mdx b/src/content/docs/aws/getting-started/index.mdx index 68be6a723..2d785e70b 100644 --- a/src/content/docs/aws/getting-started/index.mdx +++ b/src/content/docs/aws/getting-started/index.mdx @@ -27,7 +27,7 @@ LocalStack also provides advanced features for team collaboration and security, { title: 'Installation', description: - 'Install LocalStack with lstk, the LocalStack CLI, Docker, Docker Compose, or Helm.', + 'Install LocalStack with lstk, Docker, Docker Compose, or Helm.', href: '/aws/getting-started/installation/', }, { diff --git a/src/content/docs/aws/getting-started/installation.mdx b/src/content/docs/aws/getting-started/installation.mdx index d515d2059..bda8e5793 100644 --- a/src/content/docs/aws/getting-started/installation.mdx +++ b/src/content/docs/aws/getting-started/installation.mdx @@ -1,6 +1,6 @@ --- title: Installation -description: Install LocalStack with lstk, the LocalStack CLI, Docker, Docker Compose, or Helm. +description: Install LocalStack with lstk, Docker, Docker Compose, or Helm. template: doc sidebar: order: 2 @@ -13,9 +13,9 @@ import { LOCALSTACK_AWS_VERSION } from 'astro:env/server'; LocalStack provides multiple installation paths depending on your development environment and requirements. We recommend a CLI-based installation for the most consistent local startup experience. -Choose the CLI that fits your workflow: use [`lstk`](#lstk) to install, authenticate, and start LocalStack with minimal setup, or use the [LocalStack CLI](#localstack-cli) when you need full-featured management commands for advanced workflows. +Use [`lstk`](#lstk) to install, authenticate, and start LocalStack with minimal setup. -LocalStack for AWS features require an [Auth Token](/aws/getting-started/auth-token/) to activate your running instance. `lstk` handles authentication through a browser-based login flow, while the LocalStack CLI, Docker, and CI workflows can use `LOCALSTACK_AUTH_TOKEN`. +LocalStack for AWS features require an [Auth Token](/aws/getting-started/auth-token/) to activate your running instance. `lstk` handles authentication through a browser-based login flow, while Docker and CI workflows can use `LOCALSTACK_AUTH_TOKEN`. ## lstk @@ -23,9 +23,6 @@ LocalStack for AWS features require an [Auth Token](/aws/getting-started/auth-to **Requirement:** You must have a working [Docker installation](https://docs.docker.com/get-docker/) before proceeding. -:::caution[Early Release] -`lstk` currently supports core lifecycle commands: `start`, `stop`, `logs`, and `status`. For advanced features like Cloud Pods or Extensions, use the [LocalStack CLI](#localstack-cli). -::: ### Install lstk @@ -61,254 +58,10 @@ lstk update For more details, see the [lstk documentation](/aws/tooling/lstk/). -## LocalStack CLI - -The LocalStack CLI provides the full command set for managing LocalStack capabilities such as Cloud Pods, Extensions, and advanced state workflows. - -**Requirement:** You must have a working [Docker installation](https://docs.docker.com/get-docker/) before proceeding. - -### Install LocalStack CLI - - - - - - -You can download the pre-built binary for your architecture using the link below: - - - x86-64 - - - ARM64 - - -or use the curl commands below: - -For x86-64: - - - -For ARM64: - - - -Then extract the LocalStack CLI from the terminal: - - - -
-Alternative: Homebrew on Linux - -If you are using [Homebrew for Linux](https://docs.brew.sh/Homebrew-on-Linux), you can install the LocalStack CLI directly from our official LocalStack tap: - -```bash -brew install localstack/tap/localstack-cli -``` - -
- -
- - - -You can install the LocalStack CLI using Brew directly from our official LocalStack tap: - -```bash -brew install localstack/tap/localstack-cli -``` - -
-Alternative: Binary Download - -You may download the binary for your architecture using the links below: - - - Intel (AMD64) - - - Apple Silicon (ARM64) - - -or use the curl commands below: - -For Intel (AMD64): - - - -For Apple Silicon (ARM64): - - - -Then extract the LocalStack CLI from the terminal: - - - -
-
- - - -You can download the pre-built binary for your architecture using the link below: - - - Intel (AMD64) - - -Then extract the archive and execute the binary in PowerShell. - - - - - -If you cannot use the binary releases of LocalStack, you can install the Python distribution. - -Please make sure to install the following before moving ahead: - -- [Python](https://docs.python.org/3/using/index.html) -- [pip](https://pip.pypa.io/en/stable/installation/) - -Next install the LocalStack CLI in your Python environment by running: - -```bash -python3 -m pip install --upgrade localstack -``` - -:::note -To download a specific version of LocalStack CLI, replace `` with the required version from [release page](https://github.com/localstack/localstack-cli/releases). -```bash -python3 -m pip install localstack== -``` -::: - -:::tip[macOS Sierra?] -If you have problems with permissions in macOS Sierra, install with: -```bash -python3 -m pip install --user localstack -``` -::: - -:::danger -Do not use `sudo` or the `root` user when starting LocalStack. -It should be installed and started entirely under a local non-root user. -::: - -
- -### Start LocalStack CLI - -To verify that the LocalStack CLI was installed correctly, you can check the version in your terminal: - -```bash -localstack --version -``` - - - -You are all set! - -:::note -To start LocalStack, you must first [set up your auth token](/aws/getting-started/auth-token). -::: - -Once you've set up your auth token, you can start LocalStack with the following command: - -```bash -localstack start # start localstack in background with -d flag -``` - -{/* prettier-ignore */} - - -### Update LocalStack CLI - -The LocalStack CLI allows you to easily update the different components of LocalStack. -To check the various options available for updating, run: - -```bash -localstack update --help -``` - -```bash -Usage: localstack update [OPTIONS] COMMAND [ARGS]... - - Update different LocalStack components. - -Options: - -h, --help Show this message and exit. - -Commands: - all Update all LocalStack components - docker-images Update docker images LocalStack depends on - localstack-cli Update LocalStack CLI -``` - -:::note -Updating the LocalStack CLI using `localstack update localstack-cli` and `localstack update all` will work only if it was installed from the Python distribution. -If it was installed using the pre-built binary or via Brew, please run the installation steps again to update to the latest version. -::: - -For more details, see the [LocalStack CLI documentation](/aws/tooling/localstack-cli/). - ## Container and orchestration tools Use these methods when you need explicit container configuration, want to run LocalStack alongside other services, or deploy LocalStack in CI and Kubernetes environments. -For everyday local development, `lstk` or the LocalStack CLI is usually simpler. +For everyday local development, `lstk` is usually simpler. ### Docker Compose @@ -386,43 +139,12 @@ Install the [official extension](https://hub.docker.com/extensions/localstack/lo ## Troubleshooting -#### The LocalStack CLI installation is successful, but I cannot execute `localstack` - -If you can successfully install LocalStack using `pip` but you cannot use it in your terminal, you most likely haven't set up your operating system's / terminal's `PATH` variable (in order to tell them where to find programs installed via `pip`). - -- If you are using Windows, you can enable the `PATH` configuration when installing Python, [as described in the official docs of Python](https://docs.python.org/3/using/windows.html#finding-the-python-executable). -- If you are using a macOS or Linux operating system, please make sure that the `PATH` is correctly set up - either system wide, or in your terminal. - -As a workaround you can call the LocalStack CLI python module directly: - -```bash -python3 -m localstack.cli.main -``` - -#### The `localstack` CLI does not start the LocalStack container - -If you are using the `localstack` CLI to start LocalStack, but the container is not starting, please check the following: - -- Uncheck the **Use kernel networking for UDP** option in Docker Desktop (**Settings** → **Resources** → **Network**) or follow the steps in our [documentation](/aws/tooling/dns-server#system-dns-configuration) to disable it. -- Start LocalStack with a specific DNS address: - -```bash -DNS_ADDRESS=0 localstack start -``` - -- Remove port 53 as indicated in our [standard `docker-compose.yml` file](https://github.com/localstack/localstack/blob/main/docker-compose-pro.yml). - #### How should I access the LocalStack logs on my local machine? You can now avail logging output and error reporting using LocalStack logs. To access the logs, run the following command: - -```bash -localstack logs -``` - ```bash lstk logs diff --git a/src/content/docs/aws/getting-started/local-development.mdx b/src/content/docs/aws/getting-started/local-development.mdx index 2f099b807..ec243b5b9 100644 --- a/src/content/docs/aws/getting-started/local-development.mdx +++ b/src/content/docs/aws/getting-started/local-development.mdx @@ -3,7 +3,7 @@ title: Local Development description: Deploy an AWS serverless API locally using Lambda and DynamoDB on LocalStack. template: doc sidebar: - order: 4 + order: 3 --- import { Code, Tabs, TabItem, Steps } from '@astrojs/starlight/components'; @@ -48,41 +48,8 @@ If you haven't installed LocalStack yet, follow the [installation guide](/aws/ge • Web app: https://app.localstack.cloud ``` - :::note[Early Release] - `lstk` currently supports core lifecycle commands (start, stop, logs, status). - To learn more about `lstk`, see the [lstk documentation](/aws/tooling/lstk/). - For advanced features such as Cloud Pods or Extensions, use the [LocalStack CLI](/aws/getting-started/installation/#localstack-cli). - ::: - - - - Start LocalStack: - - ```bash - localstack start - ``` - - When the container is ready, you'll see these log lines: - - {/* prettier-ignore */} - - + ## Step 2: Deploy the serverless API @@ -303,11 +270,7 @@ Stop your LocalStack container to remove all emulated resources. LocalStack is e lstk stop ``` - - ```bash - localstack stop - ``` - + {/* prettier-ignore-end */} From 44049cbb8130d9546ed5688103f2c8ac92eabd73 Mon Sep 17 00:00:00 2001 From: Brian Rinaldi Date: Mon, 29 Jun 2026 09:15:05 -0400 Subject: [PATCH 39/58] Re-add install instructions for CLI --- .../{localstack-cli.md => localstack-cli.mdx} | 249 +++++++++++++++++- 1 file changed, 237 insertions(+), 12 deletions(-) rename src/content/docs/aws/tooling/{localstack-cli.md => localstack-cli.mdx} (85%) diff --git a/src/content/docs/aws/tooling/localstack-cli.md b/src/content/docs/aws/tooling/localstack-cli.mdx similarity index 85% rename from src/content/docs/aws/tooling/localstack-cli.md rename to src/content/docs/aws/tooling/localstack-cli.mdx index bff4e0835..ead3cc151 100644 --- a/src/content/docs/aws/tooling/localstack-cli.md +++ b/src/content/docs/aws/tooling/localstack-cli.mdx @@ -3,16 +3,245 @@ title: LocalStack CLI description: Reference guide for LocalStack CLI commands, options, and usage. template: doc sidebar: - order: 10 -tags: ["Hobby"] + order: 10 +tags: ['Hobby'] --- +import { Tabs, TabItem } from '@astrojs/starlight/components'; +import { LinkButton, Code } from '@astrojs/starlight/components'; +import { LOCALSTACK_AWS_VERSION } from 'astro:env/server'; + ## Introduction The LocalStack Command Line Interface (CLI) is a tool for starting, managing, and configuring your LocalStack container. It provides convenience features to interact with LocalStack features like Cloud Pods, Extensions, State Management, and more. -To install the LocalStack CLI, follow the [installation guide](/aws/getting-started/installation/#install-localstack-cli). +## Installation + + + + + +You can download the pre-built binary for your architecture using the link below: + + + {' '} + x86-64 + + + ARM64 + + +or use the curl commands below: + +For x86-64: + + + +For ARM64: + + + +Then extract the LocalStack CLI from the terminal: + + + +
+Alternative: Homebrew on Linux + +If you are using [Homebrew for Linux](https://docs.brew.sh/Homebrew-on-Linux), you can install the LocalStack CLI directly from our official LocalStack tap: + +```bash +brew install localstack/tap/localstack-cli +``` + +
+ +
+ + + +You can install the LocalStack CLI using Brew directly from our official LocalStack tap: + +```bash +brew install localstack/tap/localstack-cli +``` + +
+Alternative: Binary Download + +You may download the binary for your architecture using the link below: + + + {' '} + Intel (AMD64) + + +or use the following curl command: + + + +Then extract the LocalStack CLI from the terminal: + + + +
+
+ + + +You can download the pre-built binary for your architecture using the link below: + + + {' '} + Intel (AMD64) + + +Then extract the archive and execute the binary in Powershell. + + + + + +If you cannot use the binary releases of LocalStack, you can install the Python distribution. + +Please make sure to install the following before moving ahead: + +- [Python](https://docs.python.org/3/using/index.html) +- [pip](https://pip.pypa.io/en/stable/installation/) + +Next install the LocalStack CLI in your Python environment by running: + +```bash +python3 -m pip install --upgrade localstack +``` + +:::note +To download a specific version of LocalStack, replace `` with the required version from [changelog page](/aws/changelog). + +```bash +python3 -m pip install localstack== +``` + +::: + +:::tip[MacOS Sierra?] +If you have problems with permissions in MacOS X Sierra, install with: + +```bash +python3 -m pip install --user localstack +``` + +::: + +:::danger +Do not use `sudo` or the `root` user when starting LocalStack. +It should be installed and started entirely under a local non-root user. +::: + + +
+ +### Starting LocalStack + +To verify that the LocalStack CLI was installed correctly, you can check the version in your terminal: + + + +You are all set! + +:::note +To start LocalStack, you must first [set up your auth token](/aws/getting-started/auth-token). +::: + +Once you've set up your auth token, you can start LocalStack with the following command: + +```bash +localstack start # start localstack in background with -d flag +``` + +{/_ prettier-ignore _/} + + + +### Updating LocalStack CLI + +The LocalStack CLI allows you to easily update the different components of LocalStack. +To check the various options available for updating, run: + +```bash +localstack update --help +``` + +```bash +Usage: localstack update [OPTIONS] COMMAND [ARGS]... + + Update different LocalStack components. + +Options: + -h, --help Show this message and exit. + +Commands: + all Update all LocalStack components + docker-images Update docker images LocalStack depends on + localstack-cli Update LocalStack CLI +``` + +:::note +Updating the LocalStack CLI using `localstack update localstack-cli` and `localstack update all` will work only if it was installed from the Python distribution. +If it was installed using the pre-built binary or via Brew, please run the installation steps again to update to the latest version. +::: :::note This documentation was auto-generated from LocalStack CLI version `LocalStack CLI 2026.4.0`. @@ -22,12 +251,12 @@ This documentation was auto-generated from LocalStack CLI version `LocalStack CL The following global options are available for the `localstack` CLI: -| Option | Description | -|--------|-------------| -| `-v`, `--version` | Show the version and exit | -| `-d`, `--debug` | Enable CLI debugging mode | +| Option | Description | +| ---------------------- | ----------------------------- | +| `-v`, `--version` | Show the version and exit | +| `-d`, `--debug` | Enable CLI debugging mode | | `-p`, `--profile TEXT` | Set the configuration profile | -| `-h`, `--help` | Show help message and exit | +| `-h`, `--help` | Show help message and exit | ## Commands @@ -883,8 +1112,6 @@ Commands: #### `license activate` - - ```bash Usage: localstack license activate [OPTIONS] @@ -894,8 +1121,6 @@ Options: #### `license info` - - ```bash Usage: localstack license info [OPTIONS] From ebbdc587d8314d73dfc76ca2355b1a911fd70b4f Mon Sep 17 00:00:00 2001 From: Quetzalli Date: Tue, 30 Jun 2026 14:32:05 +0200 Subject: [PATCH 40/58] DOCS: add NEW github actions workflow feature-branch-only-to-main (#734) --- .../workflows/feature-branch-only-to-main.yml | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 .github/workflows/feature-branch-only-to-main.yml diff --git a/.github/workflows/feature-branch-only-to-main.yml b/.github/workflows/feature-branch-only-to-main.yml new file mode 100644 index 000000000..8a41d1dae --- /dev/null +++ b/.github/workflows/feature-branch-only-to-main.yml @@ -0,0 +1,28 @@ +name: "Restrict Docs PR merges" + +on: + pull_request: + types: [opened, reopened, edited] + +jobs: + validate-refs: + name: "Validate Refs" + runs-on: ubuntu-latest + steps: + - name: Validate + run: | + # We allow merging to a branch which is a feature branch for documentation. + if [[ $GITHUB_BASE_REF == aws-docs-* || $GITHUB_BASE_REF == snowflake-docs-* ]]; then + echo "Merging to a feature branch. Allowing." + exit 0 + fi + + # We allow merging to main so long as it's from a feature branch for documentation. + if [[ $GITHUB_BASE_REF == main && ($GITHUB_HEAD_REF == aws-docs-* || $GITHUB_HEAD_REF == snowflake-docs-*) ]]; then + echo "Merging feature branch to main. Allowing." + exit 0 + fi + + # All other scenarios aren't valid for merging. + echo "Please ensure all changes are merged to a feature branch. Only feature branches can be merged into main. Rejecting." + exit 1 \ No newline at end of file From 2bb2dd6157c3dcdccdefdfd563c71b66b9fc434f Mon Sep 17 00:00:00 2001 From: Kiah Imani Date: Wed, 1 Jul 2026 06:27:15 -0400 Subject: [PATCH 41/58] DOC-287: Drop Flink 1.13 runtime (#742) --- src/content/docs/aws/services/kinesisanalyticsv2.mdx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/content/docs/aws/services/kinesisanalyticsv2.mdx b/src/content/docs/aws/services/kinesisanalyticsv2.mdx index 44d44787d..47a526c9b 100644 --- a/src/content/docs/aws/services/kinesisanalyticsv2.mdx +++ b/src/content/docs/aws/services/kinesisanalyticsv2.mdx @@ -259,7 +259,6 @@ awslocal kinesisanalyticsv2 untag-resource \ | 1.19.1 | yes | yes | | 1.18.1 | yes | yes | | 1.15.2 | yes | no | -| 1.13.1 | yes | no | ## Limitations From d83ceabeb489cefb8859d0d50fb9ec154c1567be Mon Sep 17 00:00:00 2001 From: Brian Rinaldi Date: Wed, 1 Jul 2026 16:17:38 -0400 Subject: [PATCH 42/58] Updates to getting started and associated pages 1. Rearranged the items on the index page to match the order in the nav (i.e. moved auth token) 2. Moved LocalStack CLI in the tooling section lower and marked it as deprecated (previously added the install instructions back to this page). 3. Changed the title of the lstk page to lstk CLI to make it clear the purpose as I was concerned folks looking for the CLI would gravitate to the old page. 4. Added details on the quick setup for AI (i.e. the landing page and agents.md) to the AI getting started page. 5. Added the install wizard instructions for the MCP to the getting started and the MCP page. --- astro.config.mjs | 10 +- .../docs/aws/getting-started/ai-workflows.mdx | 22 ++- .../docs/aws/getting-started/index.mdx | 17 +- .../docs/aws/tooling/localstack-cli.mdx | 7 +- src/content/docs/aws/tooling/mcp-server.mdx | 184 +++++++++--------- 5 files changed, 133 insertions(+), 107 deletions(-) diff --git a/astro.config.mjs b/astro.config.mjs index 30285f0cd..f5ef793be 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -554,16 +554,12 @@ export default defineConfig({ label: 'Overview', slug: 'aws/tooling', }, - { - label: 'LocalStack CLI', - slug: 'aws/tooling/localstack-cli', - }, { label: 'LocalStack MCP Server', slug: 'aws/tooling/mcp-server', }, { - label: 'lstk', + label: 'lstk CLI', slug: 'aws/tooling/lstk', }, { @@ -623,6 +619,10 @@ export default defineConfig({ label: 'LocalSurf', slug: 'aws/tooling/localsurf', }, + { + label: 'LocalStack CLI (deprecated)', + slug: 'aws/tooling/localstack-cli', + }, ], }, { diff --git a/src/content/docs/aws/getting-started/ai-workflows.mdx b/src/content/docs/aws/getting-started/ai-workflows.mdx index a8d48e040..f58bb7b37 100644 --- a/src/content/docs/aws/getting-started/ai-workflows.mdx +++ b/src/content/docs/aws/getting-started/ai-workflows.mdx @@ -27,16 +27,30 @@ There are three common ways to use LocalStack in AI-assisted development: You do not need all three approaches to get started. If your editor supports MCP, start with the LocalStack MCP Server. Or, you can use Skills if you want reusable agent instructions. If not, ask your assistant to generate Terraform, CDK, or AWS CLI steps and run them with LocalStack's local wrappers. +## Quick Setup + +LocalStack has provided an [`agents.md`](https://blog.localstack.cloud/ai/agents.md) file that provides the full instructions for your AI agent to get started with LocalStack, including how to configure the MCP server and LocalStack Skills. Details can be found at our [agents landing page](https://blog.localstack.cloud/ai/) or you can copy and paste the instructions below into your AI agent's prompt. + +```text +Fetch https://blog.localstack.cloud/ai/agents.md and follow the instructions to set up LocalStack on my machine. +``` + +For manual setup of the MCP server and skills, you can follow the steps below. + ## Connect an MCP client -The LocalStack MCP Server connects MCP-compatible clients to your LocalStack environment. Once configured, your AI assistant can use LocalStack tools to start the container, deploy infrastructure, run AWS CLI commands, inspect logs, manage state, and query resources. +The LocalStack MCP Server connects MCP-compatible clients to your LocalStack environment. Once configured, your AI assistant can use LocalStack tools to start the container, deploy infrastructure, run AWS CLI commands, inspect logs, manage state, and query resources. The quickest way to get started with the MCP server is to use the interactive setup wizard: + +```bash +npx -y @localstack/localstack-mcp-server init +``` + +The wizard detects your installed clients, asks how you want to run the server, and writes the configuration for you. You need a valid [Auth Token](/aws/getting-started/auth-token/) to configure the server. :::note -The MCP server runs locally and talks to your LocalStack instance. Your AI assistant is the MCP client. For setup instructions and the full tool reference, see the [LocalStack MCP Server guide](/aws/tooling/mcp-server/). +The MCP server runs locally and talks to a LocalStack instance. Your AI assistant is the MCP client. For detailed setup instructions and the full tool reference, see the [LocalStack MCP Server guide](/aws/tooling/mcp-server/). ::: -All MCP server tools require a valid [Auth Token](/aws/getting-started/auth-token/) configured as `LOCALSTACK_AUTH_TOKEN`. - ## Use agent skills [LocalStack Skills](https://github.com/localstack/skills) provide reusable instructions for AI agents working with LocalStack. They help agents follow LocalStack-specific conventions when creating infrastructure, deploying resources, running tests, and inspecting local cloud state. diff --git a/src/content/docs/aws/getting-started/index.mdx b/src/content/docs/aws/getting-started/index.mdx index 2d785e70b..f704be4c6 100644 --- a/src/content/docs/aws/getting-started/index.mdx +++ b/src/content/docs/aws/getting-started/index.mdx @@ -30,12 +30,6 @@ LocalStack also provides advanced features for team collaboration and security, 'Install LocalStack with lstk, Docker, Docker Compose, or Helm.', href: '/aws/getting-started/installation/', }, - { - title: 'Auth Token', - description: - 'Configure the Auth Token required to activate LocalStack and access licensed features.', - href: '/aws/getting-started/auth-token/', - }, { title: 'Local Development', description: @@ -55,11 +49,16 @@ LocalStack also provides advanced features for team collaboration and security, href: '/aws/getting-started/ai-workflows/', }, { - title: 'FAQ', + title: 'Auth Token', description: - 'Frequently asked questions about LocalStack for AWS.', + 'Configure the Auth Token required to activate LocalStack and access licensed features.', + href: '/aws/getting-started/auth-token/', + }, + { + title: 'FAQ', + description: 'Frequently asked questions about LocalStack for AWS.', href: '/aws/getting-started/faq/', - } + }, ]} client:load /> diff --git a/src/content/docs/aws/tooling/localstack-cli.mdx b/src/content/docs/aws/tooling/localstack-cli.mdx index ead3cc151..d66f3fb93 100644 --- a/src/content/docs/aws/tooling/localstack-cli.mdx +++ b/src/content/docs/aws/tooling/localstack-cli.mdx @@ -16,6 +16,11 @@ import { LOCALSTACK_AWS_VERSION } from 'astro:env/server'; The LocalStack Command Line Interface (CLI) is a tool for starting, managing, and configuring your LocalStack container. It provides convenience features to interact with LocalStack features like Cloud Pods, Extensions, State Management, and more. +:::caution +The LocalStack CLI is deprecated and will be removed in a future version. +Please use [lstk](/aws/tooling/lstk/) instead. +::: + ## Installation @@ -244,7 +249,7 @@ If it was installed using the pre-built binary or via Brew, please run the insta ::: :::note -This documentation was auto-generated from LocalStack CLI version `LocalStack CLI 2026.4.0`. +This documentation below was auto-generated from LocalStack CLI version `LocalStack CLI 2026.4.0`. ::: ## Global Options diff --git a/src/content/docs/aws/tooling/mcp-server.mdx b/src/content/docs/aws/tooling/mcp-server.mdx index 2f580c292..bcc905e8c 100644 --- a/src/content/docs/aws/tooling/mcp-server.mdx +++ b/src/content/docs/aws/tooling/mcp-server.mdx @@ -33,7 +33,15 @@ You must include it in the `env` block of your configuration. You can get your Auth Token from the [LocalStack Web App](https://app.localstack.cloud). ::: -Choose your MCP client below for setup instructions. +The quickest way to get started with the MCP server is to use the interactive setup wizard: + +```bash +npx -y @localstack/localstack-mcp-server init +``` + +The wizard detects your installed clients, asks how you want to run the server, and writes the configuration for you. You need a valid [Auth Token](/aws/getting-started/auth-token/) to configure the server. + +For manual setup of the MCP server, choose your MCP client below for setup instructions. @@ -171,10 +179,10 @@ Refer to your client's documentation for the exact location of its MCP configura By default the MCP server connects to `http://localhost:4566`. If your LocalStack instance runs on a different host or port, set the following environment variables in the `env` block: -| Variable | Default | Description | -|---|---|---| +| Variable | Default | Description | +| --------------------- | ----------- | ----------------------------------- | | `LOCALSTACK_HOSTNAME` | `localhost` | Hostname of the LocalStack instance | -| `LOCALSTACK_PORT` | `4566` | Port of the LocalStack instance | +| `LOCALSTACK_PORT` | `4566` | Port of the LocalStack instance | You can also pass any [LocalStack configuration variable](/aws/capabilities/config/configuration/) through the `env` block. These are forwarded to the container when the `localstack-management` tool starts it. @@ -204,11 +212,11 @@ Each tool runs pre-flight checks (verifying the CLI is available, the container Manage the LocalStack runtime lifecycle for both the AWS emulator and the Snowflake emulator. -| Parameter | Type | Required | Description | -|---|---|---|---| -| `action` | `start` \| `stop` \| `restart` \| `status` | Yes | The operation to perform | -| `service` | `aws` \| `snowflake` | No | The stack to manage (default: `aws`) | -| `envVars` | `Record` | No | Extra environment variables passed on `start` | +| Parameter | Type | Required | Description | +| --------- | ------------------------------------------ | -------- | --------------------------------------------- | +| `action` | `start` \| `stop` \| `restart` \| `status` | Yes | The operation to perform | +| `service` | `aws` \| `snowflake` | No | The stack to manage (default: `aws`) | +| `envVars` | `Record` | No | Extra environment variables passed on `start` | **Example prompts:** @@ -220,17 +228,17 @@ Manage the LocalStack runtime lifecycle for both the AWS emulator and the Snowfl Deploy or destroy infrastructure on LocalStack using CDK, Terraform, SAM, or CloudFormation. -| Parameter | Type | Required | Description | -|---|---|---|---| -| `action` | `deploy` \| `destroy` \| `create-stack` \| `delete-stack` | Yes | The deployment operation | -| `projectType` | `cdk` \| `terraform` \| `sam` \| `auto` | No | Framework to use (default: `auto`, detected from project files) | -| `directory` | `string` | Yes (for `deploy`/`destroy`) | Path to the project directory | -| `variables` | `Record` | No | Variables passed as Terraform `-var` flags, CDK `--context` values, or SAM `--parameter-overrides` | -| `stackName` | `string` | Yes (for `create-stack`/`delete-stack`) | CloudFormation/SAM stack name | -| `templatePath` | `string` | No | Path to a CloudFormation/SAM template | -| `s3Bucket` | `string` | No | S3 bucket for SAM deployments (if omitted, SAM uses `--resolve-s3`) | -| `resolveS3` | `boolean` | No | For SAM deployments, whether to use `--resolve-s3` when no `s3Bucket` is provided | -| `saveParams` | `boolean` | No | For SAM deployments, whether to persist resolved parameters to `samconfig.toml` | +| Parameter | Type | Required | Description | +| -------------- | --------------------------------------------------------- | --------------------------------------- | -------------------------------------------------------------------------------------------------- | +| `action` | `deploy` \| `destroy` \| `create-stack` \| `delete-stack` | Yes | The deployment operation | +| `projectType` | `cdk` \| `terraform` \| `sam` \| `auto` | No | Framework to use (default: `auto`, detected from project files) | +| `directory` | `string` | Yes (for `deploy`/`destroy`) | Path to the project directory | +| `variables` | `Record` | No | Variables passed as Terraform `-var` flags, CDK `--context` values, or SAM `--parameter-overrides` | +| `stackName` | `string` | Yes (for `create-stack`/`delete-stack`) | CloudFormation/SAM stack name | +| `templatePath` | `string` | No | Path to a CloudFormation/SAM template | +| `s3Bucket` | `string` | No | S3 bucket for SAM deployments (if omitted, SAM uses `--resolve-s3`) | +| `resolveS3` | `boolean` | No | For SAM deployments, whether to use `--resolve-s3` when no `s3Bucket` is provided | +| `saveParams` | `boolean` | No | For SAM deployments, whether to persist resolved parameters to `samconfig.toml` | **Example prompts:** @@ -248,13 +256,13 @@ The `create-stack` and `delete-stack` actions run `awslocal` inside the LocalSta Analyze LocalStack logs to find errors, summarize API activity, or inspect raw output. -| Parameter | Type | Required | Description | -|---|---|---|---| -| `analysisType` | `summary` \| `errors` \| `requests` \| `logs` | No | Type of analysis (default: `summary`) | -| `lines` | `number` | No | Number of log lines to fetch (default: `2000`) | -| `service` | `string` | No | Filter by AWS service name | -| `operation` | `string` | No | Filter by API operation (used with `service` in `requests` mode) | -| `filter` | `string` | No | Keyword filter (used with `logs` mode only) | +| Parameter | Type | Required | Description | +| -------------- | --------------------------------------------- | -------- | ---------------------------------------------------------------- | +| `analysisType` | `summary` \| `errors` \| `requests` \| `logs` | No | Type of analysis (default: `summary`) | +| `lines` | `number` | No | Number of log lines to fetch (default: `2000`) | +| `service` | `string` | No | Filter by AWS service name | +| `operation` | `string` | No | Filter by API operation (used with `service` in `requests` mode) | +| `filter` | `string` | No | Keyword filter (used with `logs` mode only) | **Example prompts:** @@ -266,10 +274,10 @@ Analyze LocalStack logs to find errors, summarize API activity, or inspect raw o Configure IAM enforcement and generate IAM policies from access denials in the logs. -| Parameter | Type | Required | Description | -|---|---|---|---| -| `action` | `set-mode` \| `analyze-policies` \| `get-status` | Yes | The operation to perform | -| `mode` | `ENFORCED` \| `SOFT_MODE` \| `DISABLED` | Yes (for `set-mode`) | IAM enforcement level | +| Parameter | Type | Required | Description | +| --------- | ------------------------------------------------ | -------------------- | ------------------------ | +| `action` | `set-mode` \| `analyze-policies` \| `get-status` | Yes | The operation to perform | +| `mode` | `ENFORCED` \| `SOFT_MODE` \| `DISABLED` | Yes (for `set-mode`) | IAM enforcement level | **Example prompts:** @@ -281,21 +289,21 @@ Configure IAM enforcement and generate IAM policies from access denials in the l Inject faults and network latency into LocalStack services to test application resilience. -| Parameter | Type | Required | Description | -|---|---|---|---| -| `action` | `inject-faults` \| `add-fault-rule` \| `remove-fault-rule` \| `get-faults` \| `clear-all-faults` \| `inject-latency` \| `get-latency` \| `clear-latency` | Yes | The chaos operation | -| `rules` | `Array` | Yes (for `inject-faults`, `add-fault-rule`, `remove-fault-rule`) | Fault rules to inject/modify | -| `latency_ms` | `number` | Yes (for `inject-latency`) | Latency in milliseconds to add to all requests | +| Parameter | Type | Required | Description | +| ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------- | ---------------------------------------------- | +| `action` | `inject-faults` \| `add-fault-rule` \| `remove-fault-rule` \| `get-faults` \| `clear-all-faults` \| `inject-latency` \| `get-latency` \| `clear-latency` | Yes | The chaos operation | +| `rules` | `Array` | Yes (for `inject-faults`, `add-fault-rule`, `remove-fault-rule`) | Fault rules to inject/modify | +| `latency_ms` | `number` | Yes (for `inject-latency`) | Latency in milliseconds to add to all requests | Each **fault rule** can include: -| Field | Type | Description | -|---|---|---| -| `service` | `string` | Target AWS service (e.g., `s3`, `lambda`) | -| `region` | `string` | Target region (e.g., `us-east-1`) | -| `operation` | `string` | Target API operation (e.g., `PutObject`) | -| `probability` | `number` (0-1) | Probability of the fault triggering | -| `error` | `{ statusCode?: number, code?: string }` | Error response to return | +| Field | Type | Description | +| ------------- | ---------------------------------------- | ----------------------------------------- | +| `service` | `string` | Target AWS service (e.g., `s3`, `lambda`) | +| `region` | `string` | Target region (e.g., `us-east-1`) | +| `operation` | `string` | Target API operation (e.g., `PutObject`) | +| `probability` | `number` (0-1) | Probability of the fault triggering | +| `error` | `{ statusCode?: number, code?: string }` | Error response to return | **Example prompts:** @@ -307,10 +315,10 @@ Each **fault rule** can include: Save, load, and manage LocalStack state snapshots using [Cloud Pods](/aws/capabilities/state-management/cloud-pods/). -| Parameter | Type | Required | Description | -|---|---|---|---| -| `action` | `save` \| `load` \| `delete` \| `reset` | Yes | The state management operation | -| `pod_name` | `string` | Yes (for `save`/`load`/`delete`) | Name of the Cloud Pod (alphanumeric, dots, hyphens, underscores; max 128 characters) | +| Parameter | Type | Required | Description | +| ---------- | --------------------------------------- | -------------------------------- | ------------------------------------------------------------------------------------ | +| `action` | `save` \| `load` \| `delete` \| `reset` | Yes | The state management operation | +| `pod_name` | `string` | Yes (for `save`/`load`/`delete`) | Name of the Cloud Pod (alphanumeric, dots, hyphens, underscores; max 128 characters) | **Example prompts:** @@ -322,9 +330,9 @@ Save, load, and manage LocalStack state snapshots using [Cloud Pods](/aws/capabi Execute AWS CLI commands inside the running LocalStack container via `awslocal`. -| Parameter | Type | Required | Description | -|---|---|---|---| -| `command` | `string` | Yes | The AWS CLI command to run (without the `aws` or `awslocal` prefix) | +| Parameter | Type | Required | Description | +| --------- | -------- | -------- | ------------------------------------------------------------------- | +| `command` | `string` | Yes | The AWS CLI command to run (without the `aws` or `awslocal` prefix) | **Example prompts:** @@ -339,11 +347,11 @@ If a command fails due to a service not being emulated, the tool returns a link Install, uninstall, list, and discover [LocalStack Extensions](/aws/tooling/extensions/) from the marketplace. -| Parameter | Type | Required | Description | -|---|---|---|---| -| `action` | `list` \| `install` \| `uninstall` \| `available` | Yes | The extensions operation | -| `name` | `string` | Yes (for `install`/`uninstall`) | Extension package name (e.g., `localstack-extension-typedb`) | -| `source` | `string` | No | Git URL to install from (alternative to `name`) | +| Parameter | Type | Required | Description | +| --------- | ------------------------------------------------- | ------------------------------- | ------------------------------------------------------------ | +| `action` | `list` \| `install` \| `uninstall` \| `available` | Yes | The extensions operation | +| `name` | `string` | Yes (for `install`/`uninstall`) | Extension package name (e.g., `localstack-extension-typedb`) | +| `source` | `string` | No | Git URL to install from (alternative to `name`) | **Example prompts:** @@ -360,14 +368,14 @@ After installing or uninstalling an extension, the tool automatically restarts L Manage cloud-hosted [Ephemeral Instances](/aws/capabilities/cloud-sandbox/ephemeral-instances/) for remote LocalStack testing workflows. -| Parameter | Type | Required | Description | -|---|---|---|---| -| `action` | `create` \| `list` \| `logs` \| `delete` | Yes | The ephemeral instance operation | -| `name` | `string` | Yes (for `create`/`logs`/`delete`) | Instance name | -| `lifetime` | `number` | No | Lifetime in minutes for the instance (only for `create`) | -| `extension` | `string` | No | Extension package to preload on the instance (only for `create`) | -| `cloudPod` | `string` | No | Cloud Pod name to initialize state from (only for `create`) | -| `envVars` | `Record` | No | Extra environment variables for the instance (only for `create`) | +| Parameter | Type | Required | Description | +| ----------- | ---------------------------------------- | ---------------------------------- | ---------------------------------------------------------------- | +| `action` | `create` \| `list` \| `logs` \| `delete` | Yes | The ephemeral instance operation | +| `name` | `string` | Yes (for `create`/`logs`/`delete`) | Instance name | +| `lifetime` | `number` | No | Lifetime in minutes for the instance (only for `create`) | +| `extension` | `string` | No | Extension package to preload on the instance (only for `create`) | +| `cloudPod` | `string` | No | Cloud Pod name to initialize state from (only for `create`) | +| `envVars` | `Record` | No | Extra environment variables for the instance (only for `create`) | **Example prompts:** @@ -380,10 +388,10 @@ Manage cloud-hosted [Ephemeral Instances](/aws/capabilities/cloud-sandbox/epheme Search the LocalStack documentation to find guides, API references, and configuration details. -| Parameter | Type | Required | Description | -|---|---|---|---| -| `query` | `string` | Yes | The search query | -| `limit` | `number` | No | Maximum number of results to return (default: `5`, max: `10`) | +| Parameter | Type | Required | Description | +| --------- | -------- | -------- | ------------------------------------------------------------- | +| `query` | `string` | Yes | The search query | +| `limit` | `number` | No | Maximum number of results to return (default: `5`, max: `10`) | **Example prompts:** @@ -394,15 +402,15 @@ Search the LocalStack documentation to find guides, API references, and configur Execute SQL queries and commands against the [LocalStack Snowflake emulator](/snowflake/) using the Snowflake CLI (`snow`). -| Parameter | Type | Required | Description | -|---|---|---|---| -| `action` | `execute` \| `check-connection` | Yes | The operation to perform | -| `query` | `string` | Yes (for `execute`, if `file_path` not provided) | SQL query to execute | -| `file_path` | `string` | Yes (for `execute`, if `query` not provided) | Absolute path to a `.sql` file to execute | -| `database` | `string` | No | Snowflake database context | -| `schema` | `string` | No | Snowflake schema context | -| `warehouse` | `string` | No | Snowflake warehouse to use | -| `role` | `string` | No | Snowflake role to use | +| Parameter | Type | Required | Description | +| ----------- | ------------------------------- | ------------------------------------------------ | ----------------------------------------- | +| `action` | `execute` \| `check-connection` | Yes | The operation to perform | +| `query` | `string` | Yes (for `execute`, if `file_path` not provided) | SQL query to execute | +| `file_path` | `string` | Yes (for `execute`, if `query` not provided) | Absolute path to a `.sql` file to execute | +| `database` | `string` | No | Snowflake database context | +| `schema` | `string` | No | Snowflake schema context | +| `warehouse` | `string` | No | Snowflake warehouse to use | +| `role` | `string` | No | Snowflake role to use | **Example prompts:** @@ -421,31 +429,31 @@ Once your MCP client is configured, verify the setup by opening a conversation w **1. Start LocalStack** -> *"Start my LocalStack container."* +> _"Start my LocalStack container."_ The agent uses the `localstack-management` tool to start the container and confirms the status. **2. Deploy infrastructure** -> *"Deploy my CDK project in the `./my-app` directory."* +> _"Deploy my CDK project in the `./my-app` directory."_ The agent detects the framework, runs `cdklocal bootstrap` and `cdklocal deploy`, and returns the stack outputs. **3. Verify resources** -> *"List the Lambda functions and DynamoDB tables that were created."* +> _"List the Lambda functions and DynamoDB tables that were created."_ The agent runs `awslocal` commands inside the container and returns the results. **4. Analyze logs** -> *"Check the LocalStack logs for any errors."* +> _"Check the LocalStack logs for any errors."_ The agent fetches recent logs and highlights any errors or warnings. **5. Save state** -> *"Save a Cloud Pod named `my-checkpoint`."* +> _"Save a Cloud Pod named `my-checkpoint`."_ The agent persists the current LocalStack state so you can restore it later. @@ -453,13 +461,13 @@ The agent persists the current LocalStack state so you can restore it later. The following environment variables can be set in the `env` block of your MCP configuration: -| Variable | Default | Description | -|---|---|---| -| `LOCALSTACK_AUTH_TOKEN` (**required**) | None | Your LocalStack Auth Token. Required for all MCP server tools. | -| `LOCALSTACK_HOSTNAME` | `localhost` | Hostname of the LocalStack instance | -| `LOCALSTACK_PORT` | `4566` | Port of the LocalStack instance | -| `MAIN_CONTAINER_NAME` | `localstack-main` | Name of the LocalStack Docker container | -| `MCP_ANALYTICS_DISABLED` | `0` | Set to `1` to disable MCP analytics | +| Variable | Default | Description | +| -------------------------------------- | ----------------- | -------------------------------------------------------------- | +| `LOCALSTACK_AUTH_TOKEN` (**required**) | None | Your LocalStack Auth Token. Required for all MCP server tools. | +| `LOCALSTACK_HOSTNAME` | `localhost` | Hostname of the LocalStack instance | +| `LOCALSTACK_PORT` | `4566` | Port of the LocalStack instance | +| `MAIN_CONTAINER_NAME` | `localstack-main` | Name of the LocalStack Docker container | +| `MCP_ANALYTICS_DISABLED` | `0` | Set to `1` to disable MCP analytics | Any [LocalStack configuration variable](/aws/capabilities/config/configuration/) can also be passed through the `env` block. These are forwarded to the container when the `localstack-management` tool starts it. From 1dc0507b640681bf232536ff24b64ef8ab1bfe7b Mon Sep 17 00:00:00 2001 From: Josh Date: Thu, 2 Jul 2026 13:22:28 +0200 Subject: [PATCH 43/58] DOC-313: Kinesis: add option for a rust based mock (#731) Co-authored-by: Quetzalli Co-authored-by: Brian Rinaldi --- .../aws/configuration/config/configuration.md | 2 +- src/content/docs/aws/services/kinesis.mdx | 41 +++++++++++++++---- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/src/content/docs/aws/configuration/config/configuration.md b/src/content/docs/aws/configuration/config/configuration.md index 9ad76f33d..ea3366761 100644 --- a/src/content/docs/aws/configuration/config/configuration.md +++ b/src/content/docs/aws/configuration/config/configuration.md @@ -246,7 +246,7 @@ Also see [OpenSearch configuration variables](#opensearch) which are used to man | `KINESIS_SHARD_LIMIT` | `100` (default), `Infinity` (to disable) | Integer value , causing the Kinesis API to start throwing exceptions to mimic the default shard limit. | | `KINESIS_ON_DEMAND_STREAM_COUNT_LIMIT` | `10` (default), `Infinity` (to disable) | Integer value , causing the Kinesis API to start throwing exceptions to mimic the default on demand stream count limit. | | `KINESIS_LATENCY` | `500` (default), `0` (to disable)| Integer value of milliseconds, causing the Kinesis API to delay returning a response in order to mimic latency from a live AWS call. | -| `KINESIS_MOCK_PROVIDER_ENGINE` | `node` (default) \| `scala` | String value of `node` (default) or `scala` that determines the underlying build of Kinesis Mock. | +| `KINESIS_MOCK_PROVIDER_ENGINE` | `node` (default) \| `scala` \| `rust` | String value of `node` (default), `scala`, or `rust` that determines the underlying build of Kinesis Mock. See [Performance Tuning](/aws/services/kinesis#performance-tuning) for guidance on choosing an engine. | | `KINESIS_MOCK_MAXIMUM_HEAP_SIZE` | `512m` (default) | JVM memory format string that sets the maximum memory size for the Kinesis Mock Scala server, corresponds to the JVM `-Xmx` flag. | | `KINESIS_MOCK_INITIAL_HEAP_SIZE` | `256m` (default) | JVM memory format string that sets the initial memory size for the Kinesis Mock Scala server, corresponds to the JVM `-Xms` flag. | diff --git a/src/content/docs/aws/services/kinesis.mdx b/src/content/docs/aws/services/kinesis.mdx index 29792d4e1..778f0798a 100644 --- a/src/content/docs/aws/services/kinesis.mdx +++ b/src/content/docs/aws/services/kinesis.mdx @@ -170,21 +170,44 @@ You can fetch the CloudWatch logs for your Lambda function reading records from ### Performance Tuning -For high-volume workloads or large payloads, we recommend switching to the Scala engine via the `KINESIS_MOCK_PROVIDER_ENGINE=scala` flag, delivering up to 10x better performance compared to the default Node.js engine. +By default, Kinesis Mock runs on the Node.js engine (`KINESIS_MOCK_PROVIDER_ENGINE=node`). +For high-volume workloads, large payloads, or long-running setups, you can switch to a different engine using the `KINESIS_MOCK_PROVIDER_ENGINE` flag. -Additionally, the following parameters can be tuned: +#### Scala engine + +The Scala engine (`KINESIS_MOCK_PROVIDER_ENGINE=scala`) delivers up to 10x better performance compared to the default Node.js engine. +The following parameters can be tuned for the Scala engine: - Increase `KINESIS_MOCK_MAXIMUM_HEAP_SIZE` beyond the default `512m` to reduce JVM memory pressure. - Increase `KINESIS_MOCK_INITIAL_HEAP_SIZE` beyond the default `256m` to pre-allocate more JVM heap memory. -- Reduce `KINESIS_LATENCY` artificial response delays from the default `500` milliseconds (or disable entirely with `0`). - -Refer to our [Kinesis configuration documentation](https://docs.localstack.cloud/references/configuration/#kinesis) for more details on these parameters. :::note `KINESIS_MOCK_MAXIMUM_HEAP_SIZE` and `KINESIS_MOCK_INITIAL_HEAP_SIZE` are only applicable when using the Scala engine. -Future versions of LocalStack will likely default to using the `scala` engine over the less-performant `node` version currently in use. ::: +#### Rust engine + +The Rust engine (`KINESIS_MOCK_PROVIDER_ENGINE=rust`), introduced in LocalStack 2026.07, is a LocalStack-native rebuild of Kinesis Mock and is the recommended choice for any demanding or long-lived workload. +It provides: + +- **Native multi-account and multi-region support** from a single binary, regardless of how many accounts you use — this removes the per-account instance overhead described under [Limitations](#limitations). +- **Faithful enforcement of all AWS API limits**, including per-shard rate ingress/egress limits. +- **An improved persistence model** that replaces the legacy unbounded in-memory queue, allowing the mock to run under sustained load for long periods without the risk of running out of memory. + +:::caution +This is the first release of the Rust engine and it should be considered experimental for anyone opting in. + +Persistence is **not compatible** between the Rust engine and the Node.js or Scala engines, in either direction. +Any existing Kinesis persistence (including Cloud Pods and state created with the `node` or `scala` engines) will not carry over when you switch to `rust` — and vice versa. +Switching engines effectively starts from a fresh state. +::: + +#### All engines + +Regardless of the selected engine, you can reduce `KINESIS_LATENCY` artificial response delays from the default `500` milliseconds (or disable them entirely with `0`). + +Refer to our [Kinesis configuration documentation](https://docs.localstack.cloud/aws/configuration/config/configuration/#kinesis) for more details on these parameters. + ## Resource Browser The LocalStack Web Application provides a Resource Browser for managing Kinesis Streams & Kafka Clusters. @@ -209,8 +232,10 @@ The following code snippets and sample applications provide practical examples o ## Limitations -In multi-account setups, each AWS account launches a separate instance of Kinesis Mock, which is very resource intensive when a large number of AWS accounts are used. -[This Kinesis Mock issue](https://github.com/etspaceman/kinesis-mock/issues/377) is being used to keep track of this feature. +When using the default Node.js or the Scala engine, each AWS account launches a separate instance of Kinesis Mock in multi-account setups, which is very resource intensive when a large number of AWS accounts are used. +[This Kinesis Mock issue](https://github.com/etspaceman/kinesis-mock/issues/377) is being used to keep track of this feature for the upstream engines. + +The [Rust engine](#performance-tuning) (`KINESIS_MOCK_PROVIDER_ENGINE=rust`) is not affected by this limitation, as it natively supports any number of accounts and regions from a single binary. ## API Coverage From 0f3b02c1867e6969766a0d943e490bdec11cb9b5 Mon Sep 17 00:00:00 2001 From: Quetzalli Date: Thu, 2 Jul 2026 22:23:00 +0200 Subject: [PATCH 44/58] DOCS: (hotfix to `main`) Add release notes for latest Snowflake release (#752) (#753) Co-authored-by: Brian Rinaldi --- src/content/docs/snowflake/changelog.md | 171 +++++++++++++++++------- 1 file changed, 121 insertions(+), 50 deletions(-) diff --git a/src/content/docs/snowflake/changelog.md b/src/content/docs/snowflake/changelog.md index 81dee62da..2a882ee05 100644 --- a/src/content/docs/snowflake/changelog.md +++ b/src/content/docs/snowflake/changelog.md @@ -13,7 +13,34 @@ Starting with the end-of-March 2026 release, LocalStack for Snowflake follows [c For example, `2026.03.0` is the initial March 2026 release. ::: +## 2026.06.0 + +- 'Added support for `PERCENTILE_CONT` and `PERCENTILE_DISC`, the standard percentile aggregate functions used for medians, quartiles, and other distribution cutoffs.' +- '`MEDIAN` is now fixed to return correct results, since it shares its underlying implementation with `PERCENTILE_CONT`.' +- '`UNPIVOT` no longer crashes with an unhandled `IndexError` in certain query shapes.' +- '`GREATEST` and `LEAST` now preserve the input type, and generic `MIN`/`MAX` resolution was fixed alongside them.' +- '`ROUND` precision derivation now accommodates an increased scale, fixing incorrect results for some decimal roundings.' +- 'Fixed handling of certain boolean comparison expressions that previously produced incorrect results.' +- '`CONVERT_TIMESTAMP` now handles `NULL` inputs correctly instead of failing.' +- '`DATEDIFF` now handles an unquoted date part argument used inside a window function ORDER BY.' +- 'Fixed a bug affecting character/string conversion.' +- '`QUALIFY` column resolution is fixed for queries that cross-join a CTE and reference a column via its CTE alias.' +- 'Table qualifiers added during alias expansion are now quoted correctly, fixing visibility issues with `UNION ALL` over a CTE combined with `QUALIFY`.' +- '`IS NULL` now evaluates correctly against a bare `NULL` value projected through a CTE or subquery.' +- 'Unaliased derived tables in a `JOIN` clause will no longer cause the query to fail.' +- 'Nested `QUALIFY` rewrites no longer create an ambiguous internal column.' +- 'Parenthesized queries of the form `(WITH ... SELECT ...)` are no longer incorrectly rejected.' +- '`WITH RECURSIVE` will now enable recursive CTEs to be properly recognized and executed as recursive.' +- 'Scripting keywords used as implicit table aliases are no longer misinterpreted during table reference parsing.' +- 'SQL procedure bodies using `DECLARE` blocks, including `OBJECT` and `NUMBER`-typed variables and bodies containing `UPDATE ... RETURNING`, no longer fail to create.' +- '`CREATE TASK` now supports multi-statement `BEGIN ... END` bodies.' +- '`DROP STAGE IF EXISTS` no longer raises an error when the referenced stage does not exist.' +- 'Bumped `jackson-databind` to `2.18.8`, addressing CVE-2026-54512 and CVE-2026-54513.' +- 'Bumped `dulwich` and `kclpy-ext` to patched versions, addressing three High-severity CVEs.' +- 'Bumped the bundled Apache NiFi (OpenFlow) component to version 2.10.0.' + ## 2026.05.0 + - Update Docker image tagging policy to introduce `dev` and `nightly` tags, while aligning `latest` to mirror `stable` - Add support for `TRY_CAST( AS ARRAY)` conversions - Support `ARRAY_AGG(DISTINCT ...)` execution with variant path expressions @@ -29,6 +56,7 @@ For example, `2026.03.0` is the initial March 2026 release. - Fix error shapes for invalid SQL syntax and compilation failures to return Snowflake-compatible codes instead of raw backend errors ## 2026.04.0 + - Add support for AWS Glue Iceberg REST catalog integrations via `CREATE CATALOG INTEGRATION` - Add support for new SQL date/time functions (`DAY`, `DAYOFMONTH`, `DAYOFYEAR`, `QUARTER`, `WEEK`, `YEAROFWEEK`) - Support six-argument form for `TIMESTAMP_LTZ_FROM_PARTS` @@ -42,7 +70,8 @@ For example, `2026.03.0` is the initial March 2026 release. - Enhance Web App with tabbed query results, truncated result banners, and improved SQL autocomplete - Enhance Web App Resource Browser with dedicated views and icons for databases, schemas, tables, and views -### 2026.03.0 +## 2026.03.0 + - Add support for `GET_DDL` for tables, views, and databases - Add support for `FULL JOIN` and complex join conditions - Add support for looping constructs (`WHILE`, `LOOP`, `FOR`, `REPEAT`) in Snowflake scripting @@ -61,7 +90,8 @@ For example, `2026.03.0` is the initial March 2026 release. - Improve Snowpipe latency for large JSON uploads - Fix dropping of dependent views when dropping tables -### 1.7.0 +## 1.7.0 + - Add support for `OBJECT_AGG`, `QUERY_HISTORY_BY_USER`, `BOOLAND_AGG`, `BOOLOR_AGG`, `APPROX_PERCENTILE`, `LIKE`, `ILIKE`, and math functions - Add support for date arithmetics - Add support for `INFORMATION_SCHEMA.COLUMNS`, `INFORMATION_SCHEMA.SCHEMATA`, and `INFORMATION_SCHEMA.DATABASES` views @@ -81,14 +111,15 @@ For example, `2026.03.0` is the initial March 2026 release. - Fix `SYSTEM$BOOTSTRAP_DATA_REQUEST` to support varargs - Fix evaluating values for describe-only queries -### 1.6.0 +## 1.6.0 + - Add support for SQL `REGEXP_LIKE`, `SPLIT_PART`, `STRIP_NULL_VALUE`, `TRY_PARSE_JSON` function - Integrate Snowflake with S3 tables - Improve dynamic table query handling and error reporting - Support access delegation mode in Polaris catalog - Fix `DATEADD` function to support column references as input arguments - Fix casting of types for interval arithmetics -- Enhance parity for `TO_DATE` with large datetimes +- Enhance parity for `TO_DATE` with large datetimes - Bump Apache NiFi version to 2.7.1 - Enable cross-database queries in SELECT statements - Fix schema-qualified identifier handling and standardize canonical name usage @@ -99,7 +130,8 @@ For example, `2026.03.0` is the initial March 2026 release. - Add update stats to response of DML operations - Fixes schema resolution for `CREATE STREAM` statements -### 1.5.0 +## 1.5.0 + - Add support for `POSITION`, `CHARINDEX`, `LEFT`, `RIGHT`, `LENGTH/LEN` SQL function - Fix long-running queries by continuing to run them asynchronously - Enhance parity for `SELECT AVG OVER ROWS` aggregate queries @@ -110,7 +142,8 @@ For example, `2026.03.0` is the initial March 2026 release. - Enhance parity to GET a single stage file directly - Support Iceberg CTAS (`CREATE ICEBERG TABLE AS SELECT`) -### 1.4.0 +## 1.4.0 + - Add support for `SELECT * EXCLUDE (...)` - Add support for `PI` function - Enhance parity for query binding values and numeric timestamps with TZ @@ -119,7 +152,7 @@ For example, `2026.03.0` is the initial March 2026 release. - Add support for switching JSON/Arrow result encoding in session parameters - Enable returning of result batches for large query results - Fix VARCHAR type/modifier when inferred from SELECT statements -- Return exact column type/modifiers for `DESCRIBE VIEW` results +- Return exact column type/modifiers for `DESCRIBE VIEW` results - Fix default type modifiers when inferred from SELECT statements - Add logic to clean up temporary stages on session termination - Raise `DuplicateMergeKey` on `MERGE` duplicates @@ -128,9 +161,10 @@ For example, `2026.03.0` is the initial March 2026 release. - Properly handle error responses for async queries - Fix `GROUP BY` positional references being incorrectly wrapped -### 1.3.0 +## 1.3.0 + - Retry failing db commands and enhance handling of transactions -- Upgrade to Python 3.13 +- Upgrade to Python 3.13 - Expand Alias References - Support python-only queries in snowflake scripting - Remove byte order mark (BOM) in query string to support SnowConvert tool @@ -149,7 +183,8 @@ For example, `2026.03.0` is the initial March 2026 release. - Handle cross db references in `INFORMATION_SCHEMA.TABLES` view - Enhance parity of column types for `DESCRIBE VIEW` queries -### 1.2.0 +## 1.2.0 + - Add support for `SQUARE`, `FACTORIAL`, `UNIFORM`, `SYSTEM$ALLOWLIST`, `ARRAYS_ZIP`, `CURRENT_ORGANIZATION_USER`, `QUERY_HISTORY` functions - Enhance metadata for varchar type - Add support for `PIVOT` operation @@ -175,10 +210,11 @@ For example, `2026.03.0` is the initial March 2026 release. - Add initial CRUD support for resource monitors - Add initial CRUD support for masking policies - Support `SHOW REPLICATION ACCOUNTS` -- Enhance parity for creating transient schemas +- Enhance parity for creating transient schemas - Enhance `CREATE MASKING POLICY` handling -### 1.1.0 +## 1.1.0 + - Add support for functions: `ROUND`, `SYSDATE`, `STARTSWITH`, `ENDSWITH`, `MD5`, `SUBSTR`, `HAVERSINE`, `LAST_DAY`, `TRY_CAST`, `TRUNCATE`, `PERCENT_RANK`, `SYSTEM$TASK_DEPENDENTS_ENABLE` - Implement `TRY_*` conversion functions - Add number formatting parameter to `TO_DOUBLE` and `TO_DECIMAL` @@ -208,12 +244,13 @@ For example, `2026.03.0` is the initial March 2026 release. - Enhance parity for type casts on results returned from `FLATTEN` - Enhance parsing of nested variable assignments -### 1.0.1 +## 1.0.1 + - Implementation and migration to the new type system - Enhance persistence support for storing/reloading native apps - Add support for cross-db CTAS and CVAS statements - Enhance support for `ALTER DATABASE` statements -- Add initial support for `COLLATE` table columns +- Add initial support for `COLLATE` table columns - Add support for `DESCRIBE SCHEMA` - Enhance support for `ALTER SCHEMA` queries - Add support for suspending tasks @@ -227,7 +264,7 @@ For example, `2026.03.0` is the initial March 2026 release. - Implement `LOWER` and `UPPER` functions - Fix `DROP TABLE` query - Add initial support for `GRANT OWNERSHIP` statements -- Enhance CRUD support for `ROW ACCESS POLICIES` +- Enhance CRUD support for `ROW ACCESS POLICIES` - Support temporary views and dropping temp objects at session end - Enahance parity for `CREATE` and `DROP ROLE` - Fix for multi-account DB initialization @@ -246,7 +283,8 @@ For example, `2026.03.0` is the initial March 2026 release. - Enhance parity on metadata results for copy into command - Fix for numeric bool values -### 1.0.0 +## 1.0.0 + - Add support for `SHOW/ALTER FUNCTION` - Fix incompatibilities with GO driver and SnowSQL client - Add support for `SHOW INDEXES` @@ -289,8 +327,8 @@ For example, `2026.03.0` is the initial March 2026 release. - Add auto-conversion of strings to `ARRAY/OBJECT` types - Add support for Polaris catalog +## 0.3.0 -### 0.3.0 - Add support for multi-account setups - Add initial support for Java UDFs - Add initial support for native apps and `APPLICATION PACKAGEs` @@ -325,7 +363,8 @@ For example, `2026.03.0` is the initial March 2026 release. - Improve JDBC driver compatibility - Support LS alias to LIST files from stages -### 0.2.5 +## 0.2.5 + - Change storage integration to not be associated with DB/schema - Add enhanced support for SHOW ROLES and USE ROLE - Enhance parity for COUNT(..) with NULL values @@ -360,7 +399,8 @@ For example, `2026.03.0` is the initial March 2026 release. - Add support for IF EXISTS clauses in ALTER COLUMN queries - Add initial support for user-defined transaction management -### 0.2.4 +## 0.2.4 + - Support `POWER`/`POW`/`DIV0NULL`/`IFNULL` functions - Add support for COPY INTO location - Add initial support for table/database clones @@ -392,7 +432,8 @@ For example, `2026.03.0` is the initial March 2026 release. - Improve general error handling - Add initial support for `SHOW GRANTS TO/OF` -### 0.2.3 +## 0.2.3 + - Add initial support for `OBJECT_KEYS`/`PARSE_IP`/`DESCRIBE FUNCTION` functions - Add support for various functions including `DATE_TRUNC`, `NVL2`, `LEAST`, `GREATEST`, and more - Enhance parity for creation/deletion of schemas with fully qualified names @@ -405,7 +446,8 @@ For example, `2026.03.0` is the initial March 2026 release. - Implement trigonometric and hyperbolic functions - Add support for GET stage files -### 0.2.2 +## 0.2.2 + - Add initial support for hybrid tables and dynamic tables - Add support for `OBJECT_CONSTRUCT_KEEP_NULL`/`AS_DOUBLE`/`AS_INTEGER`/`AS_NUMBER`/`AS_CHAR` - Add `/result` API endpoint to retrieve query results @@ -418,7 +460,8 @@ For example, `2026.03.0` is the initial March 2026 release. - Enhance custom JSON parsing to allow escaped characters - Enhance parity of `TIMESTAMP_LTZ` for Flyway compatibility -### 0.2.1 +## 0.2.1 + - Add initial support for Iceberg tables - Add initial support for external volumes and Snowflake pipes - Support `LIST`/`REMOVE` queries for staged files @@ -435,7 +478,8 @@ For example, `2026.03.0` is the initial March 2026 release. - Add MUI data-grid for results table in UI - Add squashing of Docker image to reduce size -### 0.2.0 +## 0.2.0 + - Support various SQL functions (`BITAND`, `FLATTEN`, `RANDOM`, etc.) - Add Snowflake proxy request handler - Add initial version of simple UI view @@ -447,7 +491,8 @@ For example, `2026.03.0` is the initial March 2026 release. - Add Snowflake v2 SQL APIs - Fix `describeOnly` `INSERT` queries -### 0.1.26 +## 0.1.26 + - Support `CONVERT_TIMEZONE`, `IFF` SQL functions - Implement `ALTER WAREHOUSE` as no-op - Implement time functions @@ -458,125 +503,151 @@ For example, `2026.03.0` is the initial March 2026 release. - Implement additional date functions - Add support for loading data from public S3 buckets -### 0.1.25 +## 0.1.25 + - Enhance support for various SHOW queries - Add initial persistence support for Snowflake store - Enhance parity for timestamp types - Fix SHOW PARAMETERS for Terraform compatibility - Set up CI build for Docker image -### 0.1.24 +## 0.1.24 + - Enhance parity around user-defined PROCEDUREs - Fix upper-casing for various functions - Enhance support for UNIQUE column constraints - Add initial support for cross-DB resource sharing -### 0.1.23 +## 0.1.23 + - Add initial simple scheduler to periodically run tasks -### 0.1.22 +## 0.1.22 + - Fix query transforms for `ADD COLUMN` queries - Fix wrapping of `VALUES` subquery in braces - Add initial CRUD support for `TASK`s - Support `DROP PRIMARY KEY` queries - Migrate use of `localstack.http` to `rolo` -### 0.1.21 +## 0.1.21 + - Add support for consuming table stream records via DML statements -### 0.1.20 +## 0.1.20 + - Initial simple support for table streams - Add support for `SHOW DATABASES`, `SHOW VIEWS` - Enhance parity for Arrow results - Fix various identifier and query issues -### 0.1.19 +## 0.1.19 + - Return `SELECT` results in arrow format for pandas compatibility - Add `add_months` function - Fix UDFs with raw expressions - Upgrade to Postgres v15 - Various parity and performance improvements -### 0.1.18 +## 0.1.18 + - Add support for various array and aggregation functions - Enhance `FILE FORMAT` operations - Fix `CTAS` queries - Support `INFER_SCHEMA(..)` for parquet files - Improve identifier handling -### 0.1.17 +## 0.1.17 + - Support creation/deletion of stages - Add `IS_ARRAY` function - Remove `DuckDB` based `DB` engine - Refactor codebase to use `QueryProcessor` interface - Enhance column name handling -### 0.1.16 +## 0.1.16 + - Add support for `SHOW PROCEDURES` and `SHOW IMPORTED KEYS` - Add basic support for session parameters -### 0.1.15 +## 0.1.15 + - Fix result type conversation for `GET_PATH(..)` util function -### 0.1.14 +## 0.1.14 + - Enhance parity around `SHOW` queries - Add more array util functions - Fix `STRING_AGG` functionality -### 0.1.13 +## 0.1.13 + - Support `CURRENT_*` functions - Enhance `LISTAGG` for distinct values - Add test for `JS` UDFs with exports -### 0.1.12 +## 0.1.12 + - Cast params for `string_agg`/`listagg` - Fix parity for upper/lowercase names -### 0.1.11 +## 0.1.11 + - Enhance parity for array aggregation functions - Improve timestamp timezone handling - Add case-sensitive identifier tracking -### 0.1.10 +## 0.1.10 + - Add query transforms for `CLUSTER BY` - Add `SF_S3_ENDPOINT` config - Various parity fixes -### 0.1.9 +## 0.1.9 + - Add support for `Python` UDFs - Enhance function creation parity - Add analytics setup -### 0.1.8 +## 0.1.8 + - Add `SF_LOG` config for request/response trace logging -### 0.1.7 +## 0.1.7 + - Add initial support for `JavaScript` UDFs - Enhance DB/table creation responses - Improve streaming logic -### 0.1.6 +## 0.1.6 + - Introduce session state for DB/schema retention - Support async queries and `result_scan(..)` -### 0.1.5 +## 0.1.5 + - Enhance `DESCRIBE TABLE` results - Support `MIN_BY`/`MAX_BY` aggregate functions -### 0.1.4 +## 0.1.4 + - Add logic to parse and replace `DB` references in queries -### 0.1.3 +## 0.1.3 + - Add `DBEngine` abstraction - Add experimental support for `duckdb` - Enhance `JSON` query support -### 0.1.2 +## 0.1.2 + - Add CSV file ingestion from Snowflake stage to table -### 0.1.1 +## 0.1.1 + - Initial support for `Kafka` connector - Add `snowpipe`/streaming APIs -### 0.1.0 +## 0.1.0 + - Initial release of the extension From 66070435ad652b1c09d916651f0bffa952a2e354 Mon Sep 17 00:00:00 2001 From: Quetzalli Date: Fri, 3 Jul 2026 12:26:41 +0200 Subject: [PATCH 45/58] DOC-313: (hotfix to `main`) Kinesis: add option for a rust based mock - revert (#754) (#755) Co-authored-by: Josh --- .../aws/configuration/config/configuration.md | 2 +- src/content/docs/aws/services/kinesis.mdx | 41 ++++--------------- 2 files changed, 9 insertions(+), 34 deletions(-) diff --git a/src/content/docs/aws/configuration/config/configuration.md b/src/content/docs/aws/configuration/config/configuration.md index ea3366761..9ad76f33d 100644 --- a/src/content/docs/aws/configuration/config/configuration.md +++ b/src/content/docs/aws/configuration/config/configuration.md @@ -246,7 +246,7 @@ Also see [OpenSearch configuration variables](#opensearch) which are used to man | `KINESIS_SHARD_LIMIT` | `100` (default), `Infinity` (to disable) | Integer value , causing the Kinesis API to start throwing exceptions to mimic the default shard limit. | | `KINESIS_ON_DEMAND_STREAM_COUNT_LIMIT` | `10` (default), `Infinity` (to disable) | Integer value , causing the Kinesis API to start throwing exceptions to mimic the default on demand stream count limit. | | `KINESIS_LATENCY` | `500` (default), `0` (to disable)| Integer value of milliseconds, causing the Kinesis API to delay returning a response in order to mimic latency from a live AWS call. | -| `KINESIS_MOCK_PROVIDER_ENGINE` | `node` (default) \| `scala` \| `rust` | String value of `node` (default), `scala`, or `rust` that determines the underlying build of Kinesis Mock. See [Performance Tuning](/aws/services/kinesis#performance-tuning) for guidance on choosing an engine. | +| `KINESIS_MOCK_PROVIDER_ENGINE` | `node` (default) \| `scala` | String value of `node` (default) or `scala` that determines the underlying build of Kinesis Mock. | | `KINESIS_MOCK_MAXIMUM_HEAP_SIZE` | `512m` (default) | JVM memory format string that sets the maximum memory size for the Kinesis Mock Scala server, corresponds to the JVM `-Xmx` flag. | | `KINESIS_MOCK_INITIAL_HEAP_SIZE` | `256m` (default) | JVM memory format string that sets the initial memory size for the Kinesis Mock Scala server, corresponds to the JVM `-Xms` flag. | diff --git a/src/content/docs/aws/services/kinesis.mdx b/src/content/docs/aws/services/kinesis.mdx index 778f0798a..29792d4e1 100644 --- a/src/content/docs/aws/services/kinesis.mdx +++ b/src/content/docs/aws/services/kinesis.mdx @@ -170,44 +170,21 @@ You can fetch the CloudWatch logs for your Lambda function reading records from ### Performance Tuning -By default, Kinesis Mock runs on the Node.js engine (`KINESIS_MOCK_PROVIDER_ENGINE=node`). -For high-volume workloads, large payloads, or long-running setups, you can switch to a different engine using the `KINESIS_MOCK_PROVIDER_ENGINE` flag. +For high-volume workloads or large payloads, we recommend switching to the Scala engine via the `KINESIS_MOCK_PROVIDER_ENGINE=scala` flag, delivering up to 10x better performance compared to the default Node.js engine. -#### Scala engine - -The Scala engine (`KINESIS_MOCK_PROVIDER_ENGINE=scala`) delivers up to 10x better performance compared to the default Node.js engine. -The following parameters can be tuned for the Scala engine: +Additionally, the following parameters can be tuned: - Increase `KINESIS_MOCK_MAXIMUM_HEAP_SIZE` beyond the default `512m` to reduce JVM memory pressure. - Increase `KINESIS_MOCK_INITIAL_HEAP_SIZE` beyond the default `256m` to pre-allocate more JVM heap memory. +- Reduce `KINESIS_LATENCY` artificial response delays from the default `500` milliseconds (or disable entirely with `0`). + +Refer to our [Kinesis configuration documentation](https://docs.localstack.cloud/references/configuration/#kinesis) for more details on these parameters. :::note `KINESIS_MOCK_MAXIMUM_HEAP_SIZE` and `KINESIS_MOCK_INITIAL_HEAP_SIZE` are only applicable when using the Scala engine. +Future versions of LocalStack will likely default to using the `scala` engine over the less-performant `node` version currently in use. ::: -#### Rust engine - -The Rust engine (`KINESIS_MOCK_PROVIDER_ENGINE=rust`), introduced in LocalStack 2026.07, is a LocalStack-native rebuild of Kinesis Mock and is the recommended choice for any demanding or long-lived workload. -It provides: - -- **Native multi-account and multi-region support** from a single binary, regardless of how many accounts you use — this removes the per-account instance overhead described under [Limitations](#limitations). -- **Faithful enforcement of all AWS API limits**, including per-shard rate ingress/egress limits. -- **An improved persistence model** that replaces the legacy unbounded in-memory queue, allowing the mock to run under sustained load for long periods without the risk of running out of memory. - -:::caution -This is the first release of the Rust engine and it should be considered experimental for anyone opting in. - -Persistence is **not compatible** between the Rust engine and the Node.js or Scala engines, in either direction. -Any existing Kinesis persistence (including Cloud Pods and state created with the `node` or `scala` engines) will not carry over when you switch to `rust` — and vice versa. -Switching engines effectively starts from a fresh state. -::: - -#### All engines - -Regardless of the selected engine, you can reduce `KINESIS_LATENCY` artificial response delays from the default `500` milliseconds (or disable them entirely with `0`). - -Refer to our [Kinesis configuration documentation](https://docs.localstack.cloud/aws/configuration/config/configuration/#kinesis) for more details on these parameters. - ## Resource Browser The LocalStack Web Application provides a Resource Browser for managing Kinesis Streams & Kafka Clusters. @@ -232,10 +209,8 @@ The following code snippets and sample applications provide practical examples o ## Limitations -When using the default Node.js or the Scala engine, each AWS account launches a separate instance of Kinesis Mock in multi-account setups, which is very resource intensive when a large number of AWS accounts are used. -[This Kinesis Mock issue](https://github.com/etspaceman/kinesis-mock/issues/377) is being used to keep track of this feature for the upstream engines. - -The [Rust engine](#performance-tuning) (`KINESIS_MOCK_PROVIDER_ENGINE=rust`) is not affected by this limitation, as it natively supports any number of accounts and regions from a single binary. +In multi-account setups, each AWS account launches a separate instance of Kinesis Mock, which is very resource intensive when a large number of AWS accounts are used. +[This Kinesis Mock issue](https://github.com/etspaceman/kinesis-mock/issues/377) is being used to keep track of this feature. ## API Coverage From e13619c5d6094afa4a116b84d7498f9bdc0bcab3 Mon Sep 17 00:00:00 2001 From: Harsh Mishra Date: Fri, 3 Jul 2026 12:14:28 -0700 Subject: [PATCH 46/58] document SCP enforcement for cross-account access (#716) Co-authored-by: Viren Nadkarni --- .../security-testing/iam-coverage.md | 4 ++ .../docs/aws/services/organizations.mdx | 69 +++++++++++++++++++ 2 files changed, 73 insertions(+) diff --git a/src/content/docs/aws/developer-tools/security-testing/iam-coverage.md b/src/content/docs/aws/developer-tools/security-testing/iam-coverage.md index ae6a05d85..6da101568 100644 --- a/src/content/docs/aws/developer-tools/security-testing/iam-coverage.md +++ b/src/content/docs/aws/developer-tools/security-testing/iam-coverage.md @@ -123,6 +123,10 @@ It only includes operations performed with a principal, not as root, so test set | **Permission Boundaries** | | | | - Roles | | | - Users | +| **Service Control Policies (SCPs)** | | +| | - Enforced across the organization hierarchy (root, OU, account) | +| | - Enforced for cross-account access | +| | - Evaluated by the IAM Policy Simulator | ## Supported Policy Features diff --git a/src/content/docs/aws/services/organizations.mdx b/src/content/docs/aws/services/organizations.mdx index cf7d08370..07474f8d8 100644 --- a/src/content/docs/aws/services/organizations.mdx +++ b/src/content/docs/aws/services/organizations.mdx @@ -88,6 +88,75 @@ To get started, start your LocalStack instance using your preferred method: awslocal organizations delete-organization ``` +## Service Control Policy enforcement + +[Service Control Policies (SCPs)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html) set the maximum permissions for accounts in your organization. +When IAM enforcement is enabled, LocalStack checks SCPs together with other applicable policies. +A request goes through only if both the principal's policies, resource's policies and the SCPs covering its account allow the action on the resource. + +To turn on SCP enforcement, start LocalStack with [`ENFORCE_IAM=1`](/aws/developer-tools/security-testing/iam-policy-enforcement) and enable the `SERVICE_CONTROL_POLICY` policy type on your organization root (see the [getting started](#getting-started) steps above). + +LocalStack evaluates SCPs at each level of the organization hierarchy: root, organizational unit, and account. +An action must be allowed by an SCP at every level between the root and the account. +If any level lacks an `Allow`, the result is an implicit deny, and an explicit `Deny` overrides any `Allow`. + +:::note +The organization's management (master) account is exempt from SCPs. +Principals in the management account are never restricted by SCPs, even with an explicit `Deny` SCP attached. +::: + +### Cross-account access + +LocalStack enforces SCPs for [cross-account access](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic-cross-account.html), where a principal in one account uses a resource owned by another account. + +For a cross-account request, LocalStack checks the SCPs of the source account (the account making the request). +A deny in those SCPs blocks the request even when the target resource's policy grants access. + +Consider a member account that lists the objects of an S3 bucket in another account of the same organization, with a bucket policy that grants the member account access: + +```bash +# Run as the member (source) account +awslocal s3api list-objects-v2 --bucket cross-account-bucket +``` + +The default `FullAWSAccess` SCP lets the request succeed on the bucket policy. +Attach an SCP that denies `s3:ListBucket` to the member account, and the request fails: + +```bash title="Output" +An error occurred (AccessDenied) when calling the ListObjectsV2 operation: User: arn:aws:iam::111111111111:user/test is not authorized to perform: s3:ListBucket on resource: "arn:aws:s3:::cross-account-bucket" with an explicit deny in a service control policy +``` + +An SCP that allows only unrelated actions (for example, an `ec2:*`-only SCP) produces an implicit deny, since no SCP allows `s3:ListBucket`: + +```bash title="Output" +An error occurred (AccessDenied) when calling the ListObjectsV2 operation: User: arn:aws:iam::111111111111:user/test is not authorized to perform: s3:ListBucket on resource: "arn:aws:s3:::cross-account-bucket" because no service control policy allows the s3:ListBucket action +``` + +The management account stays exempt from SCPs for cross-account requests too. + +### Testing SCPs with the IAM Policy Simulator + +You can use the [IAM Policy Simulator](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_testing-policies.html) to check whether a principal's request would be allowed or denied without running it against your resources. +LocalStack evaluates SCPs during policy simulation, so you can validate SCP behavior with [`SimulatePrincipalPolicy`](https://docs.aws.amazon.com/IAM/latest/APIReference/API_SimulatePrincipalPolicy.html) before making live requests. + +```bash +awslocal iam simulate-principal-policy \ + --policy-source-arn arn:aws:iam::111111111111:user/test \ + --action-names s3:ListBucket \ + --resource-arns arn:aws:s3:::cross-account-bucket +``` + +When SCPs affect the decision, LocalStack populates the `OrganizationsDecisionDetail` field of the [`EvaluationResult`](https://docs.aws.amazon.com/IAM/latest/APIReference/API_EvaluationResult.html), so you can see whether an SCP allowed the action. + +:::note +LocalStack's Policy Simulator and its IAM enforcement engine share the same underlying evaluation logic. +As a result, the simulator reflects the real AWS IAM behavior rather than the behavior of the AWS Policy Simulator, which differs in a few ways: + +- AWS ignores SCPs that contain conditions during simulation. LocalStack evaluates SCPs with conditions. +- AWS applies SCPs to the organization's management account during simulation. LocalStack does not apply SCPs to the management account, matching the real behavior of AWS Organizations. +- AWS reports an explicit `Deny` from an SCP as an implicit deny. LocalStack reports it as an explicit deny, which is the expected outcome. +::: + ## API Coverage From 431212142b77fdf642005bf2b4544f37e4a60cda Mon Sep 17 00:00:00 2001 From: Harsh Mishra Date: Mon, 6 Jul 2026 02:11:13 -0700 Subject: [PATCH 47/58] Document Replicator batch and tree replication strategies (#696) --- .../ReplicatorCoverage.tsx | 656 +++++++++++------- .../developer-tools/aws-replicator/index.mdx | 39 +- 2 files changed, 452 insertions(+), 243 deletions(-) diff --git a/src/components/replicator-coverage/ReplicatorCoverage.tsx b/src/components/replicator-coverage/ReplicatorCoverage.tsx index 63cc2d410..184f3812e 100644 --- a/src/components/replicator-coverage/ReplicatorCoverage.tsx +++ b/src/components/replicator-coverage/ReplicatorCoverage.tsx @@ -1,261 +1,433 @@ -import React from 'react'; +import React, { useState } from 'react'; import data from '@/data/replicator/coverage.json'; -import { - Table, - TableHeader, - TableBody, - TableRow, - TableHead, - TableCell, -} from '@/components/ui/table'; -import { - useReactTable, - getCoreRowModel, - flexRender, -} from '@tanstack/react-table'; -import type { ColumnDef, ColumnSizingState } from '@tanstack/react-table'; -import { useTableColumnSizing } from '@/hooks/useTableColumnSizing'; -import { useState } from 'react'; +import { ChevronRight } from 'lucide-react'; -const coverage = Object.values(data); +type ReplicationTypeInfo = { + policy_statements: string[]; + identifier: string | null; +}; -const columns: ColumnDef[] = [ - { - accessorKey: 'resource_type', - header: () => 'Resource Type', - cell: ({ row }) => row.original.resource_type, - size: 150, - minSize: 120, - maxSize: 200, - }, - { - accessorKey: 'service', - header: () => 'Service', - cell: ({ row }) => row.original.service, - size: 120, - minSize: 100, - maxSize: 150, - }, - { - accessorKey: 'identifier', - header: () => 'Identifier', - cell: ({ row }) => row.original.single.identifier, - size: 150, - minSize: 120, - maxSize: 200, +type ResourceTreeInfo = { + resources: string[]; + extra_policy_statements: string[]; +}; + +type ExtraConfigField = { + type: string; + default: unknown; + description: string; +}; + +type ResourceCoverage = { + resource_type: string; + service: string; + single?: ReplicationTypeInfo; + batch?: ReplicationTypeInfo; + resource_tree?: ResourceTreeInfo; + extra_config?: Record; +}; + +const coverage = data as ResourceCoverage[]; + +type StrategyKey = 'single' | 'batch' | 'tree'; + +const STRATEGY_META: Record< + StrategyKey, + { label: string; color: string; description: string } +> = { + single: { + label: 'Single', + color: '#2563eb', + description: 'Replicate one resource at a time by identifier or ARN.', }, - { - accessorKey: 'policy_statements', - header: () => 'Required Actions', - cell: ({ row }) => ( - <> - {row.original.single.policy_statements.map((s: string, i: number) => ( -
{s}
- ))} - - ), - size: 300, - minSize: 200, - maxSize: 500, + batch: { + label: 'Batch', + color: '#7c3aed', + description: 'Discover and replicate many matching resources in one job.', }, - { - id: 'arn_support', - header: () => 'Arn Support', - cell: () => '✔️', - size: 100, - minSize: 80, - maxSize: 120, + tree: { + label: 'Tree', + color: '#0d9488', + description: + 'Use the TREE explore strategy to also replicate related child resources.', }, -]; +}; -export default function ReplicatorCoverage() { - // Use the reusable hook for column sizing - const { columnSizing, setColumnSizing } = useTableColumnSizing(columns); +function StrategyBadge({ + strategy, + active, +}: { + strategy: StrategyKey; + active: boolean; +}) { + const meta = STRATEGY_META[strategy]; + return ( + + {meta.label} + + ); +} - const table = useReactTable({ - data: coverage, - columns, - state: { - columnSizing, - }, - onColumnSizingChange: setColumnSizing, - columnResizeMode: 'onChange', - getCoreRowModel: getCoreRowModel(), - debugTable: false, - }); +function PolicyList({ statements }: { statements: string[] }) { + if (!statements.length) { + return ( + + No additional actions required + + ); + } + return ( +
+ {statements.map((statement) => ( + + {statement} + + ))} +
+ ); +} - // For testing purposes, we can log the column sizing state - // console.log('Column sizing state:', columnSizing); +function Identifier({ value }: { value: string | null }) { + if (!value) { + return ( + None required + ); + } + return ( + + {value} + + ); +} - // Add CSS for resizer - const resizerStyle = ` - .resizer { - position: absolute; - right: 0; - top: 0; - height: 100%; - width: 5px; - background: rgba(0, 0, 0, 0.1); - cursor: col-resize; - user-select: none; - touch-action: none; - } - .resizer.isResizing { - background: rgba(0, 0, 0, 0.2); - opacity: 1; - } - @media (hover: hover) { - .resizer { - opacity: 0; - } - *:hover > .resizer { - opacity: 1; - } - } - `; +function DetailSection({ + strategy, + children, +}: { + strategy: StrategyKey; + children: React.ReactNode; +}) { + const meta = STRATEGY_META[strategy]; + return ( +
+
+ + + {meta.description} + +
+ {children} +
+ ); +} + +function Field({ label, children }: { label: string; children: React.ReactNode }) { + return ( +
+
+ {label} +
+ {children} +
+ ); +} +function ResourceDetails({ resource }: { resource: ResourceCoverage }) { return ( -
- -
- + {resource.single && ( + + + + + + + + + )} + + {resource.batch && ( + + + + + + + + + )} + + {resource.resource_tree && ( + + +
+ {resource.resource_tree.resources.map((r) => ( + + {r} + + ))} +
+
+ + + +
+ )} + + {resource.extra_config && ( + + +
+ {Object.entries(resource.extra_config).map(([name, field]) => ( +
+ + {name} + {' '} + + ({field.type} + {field.default !== null && field.default !== undefined + ? `, default: ${JSON.stringify(field.default)}` + : ''} + ) + +
{field.description}
+
+ ))} +
+
+
+ )} + + ); +} + +export default function ReplicatorCoverage() { + const [expanded, setExpanded] = useState>({}); + + const toggle = (resourceType: string) => + setExpanded((prev) => ({ ...prev, [resourceType]: !prev[resourceType] })); + + return ( +
+
+ {(Object.keys(STRATEGY_META) as StrategyKey[]).map((key) => ( + + + {STRATEGY_META[key].description} + + ))} +
+ +
+
- - {table.getHeaderGroups().map((headerGroup) => ( - - {headerGroup.headers.map((header) => { - const meta = header.column.columnDef.meta as - | { className?: string } - | undefined; - - const getColumnWidth = (columnId: string) => { - switch (columnId) { - case 'resource_type': - return '20%'; - case 'service': - return '15%'; - case 'identifier': - return '20%'; - case 'policy_statements': - return '35%'; - case 'arn_support': - return '10%'; - default: - return 'auto'; - } - }; - - return ( - - {flexRender( - header.column.columnDef.header, - header.getContext() - )} - {header.column.getCanResize() && ( -
- )} -
- ); - })} -
- ))} -
- - {table.getRowModel().rows.map((row) => ( - - {row.getVisibleCells().map((cell) => { - const meta = cell.column.columnDef.meta as - | { className?: string } - | undefined; - - const getColumnWidth = (columnId: string) => { - switch (columnId) { - case 'resource_type': - return '20%'; - case 'service': - return '15%'; - case 'identifier': - return '20%'; - case 'policy_statements': - return '35%'; - case 'arn_support': - return '10%'; - default: - return 'auto'; - } - }; - - return ( - - {flexRender( - cell.column.columnDef.cell, - cell.getContext() - )} - - ); - })} - - ))} - -
+
+ + {coverage.map((resource, idx) => { + const isOpen = !!expanded[resource.resource_type]; + return ( +
+ + {isOpen && } +
+ ); + })}
); } - -// Testing instructions: -// 1. Verify that the table expands to 100% width of its container -// 2. Check that columns maintain their widths during pagination -// 3. Test with different viewport sizes to ensure responsive behavior -// 4. Try resizing columns to ensure the resize functionality works -// 5. Verify that content in cells is properly displayed with ellipsis for overflow diff --git a/src/content/docs/aws/developer-tools/aws-replicator/index.mdx b/src/content/docs/aws/developer-tools/aws-replicator/index.mdx index a6738e96c..f05ff9a3a 100644 --- a/src/content/docs/aws/developer-tools/aws-replicator/index.mdx +++ b/src/content/docs/aws/developer-tools/aws-replicator/index.mdx @@ -70,6 +70,17 @@ Both methods have two steps: 1. Submit a replication job. 2. Check the job status. +#### Replication strategies + +The Replicator supports different strategies depending on how many resources you want to copy and whether their related resources should be included. +The [supported resources](#supported-resources) table shows which strategies are available for each resource type, along with the IAM actions required for each. + +- **Single** (`SINGLE_RESOURCE`): replicate a single resource identified by its identifier or ARN. This is the default. +- **Batch** (`BATCH`): discover and replicate every matching resource in a single job, for example all SSM parameters under a path prefix or all S3 buckets matching a prefix. +- **Tree** (`TREE` explore strategy): starting from a single resource, also replicate its related child resources. For example, replicating an `AWS::Organizations::Organization` also replicates its organizational units, accounts, and policies. + +The replication type and explore strategy are independent: `replication_type` selects between single-resource and batch discovery, while `explore_strategy` (`SIMPLE` or `TREE`) controls whether related resources are followed. + #### Using the LocalStack CLI The Replicator CLI is part of the LocalStack CLI. @@ -189,6 +200,29 @@ For example: This triggers a batch replication job that discovers and replicates all SSM parameters under the `/dev/` path prefix. +To replicate a resource together with its related resources, set `explore_strategy` to `TREE`. +For example, to replicate an entire organization tree: + +```json +{ + "replication_type": "SINGLE_RESOURCE", + "explore_strategy": "TREE", + "replication_job_config": { + "resource_type": "AWS::Organizations::Organization", + "identifier": "o-exampleorgid" + }, + "source_aws_config": { + "aws_access_key_id": "...", + "aws_secret_access_key": "...", + "region_name": "..." + } +} +``` + +When `explore_strategy` is omitted, the default is `SIMPLE`, which replicates only the requested resource. +With `TREE`, the Replicator follows the resource's relationships and replicates the related resources listed in the [supported resources](#supported-resources) table. +The additional IAM actions shown for the **Tree** strategy must also be granted. + ### Check Replication Job Status @@ -397,4 +431,7 @@ Please open a [new GitHub Discussion](https://github.com/orgs/localstack/discuss To ensure support for all resources, use the latest LocalStack Docker image. ::: - +The table below lists every supported resource type and the [replication strategies](#replication-strategies) available for each. +Select a row to expand it and view the resource identifier, the IAM actions required for each strategy, and any related resources replicated by the Tree strategy. + + From e2f86e79bfebf75941355774d19bfa4cc4f3bd80 Mon Sep 17 00:00:00 2001 From: Harsh Mishra Date: Mon, 6 Jul 2026 02:14:38 -0700 Subject: [PATCH 48/58] add the official localstack extensions page (#713) --- .github/workflows/update-extensions-docs.yml | 73 ++++++ astro.config.mjs | 4 - scripts/generate_extensions_docs.py | 239 ++++++++++++++++++ .../tooling/extensions/official-extensions.md | 54 ++++ 4 files changed, 366 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/update-extensions-docs.yml create mode 100644 scripts/generate_extensions_docs.py create mode 100644 src/content/docs/aws/tooling/extensions/official-extensions.md diff --git a/.github/workflows/update-extensions-docs.yml b/.github/workflows/update-extensions-docs.yml new file mode 100644 index 000000000..c32a49fa3 --- /dev/null +++ b/.github/workflows/update-extensions-docs.yml @@ -0,0 +1,73 @@ +name: Update LocalStack Extensions Docs + +on: + schedule: + # Run on the 1st of every month at 00:00 UTC + - cron: "0 0 1 * *" + workflow_dispatch: + inputs: + targetBranch: + description: 'Target branch to create the PR against' + required: false + type: string + default: 'main' + +env: + TARGET_BRANCH: ${{ github.event.inputs.targetBranch || 'main' }} + +jobs: + update-extensions-docs: + name: Update LocalStack Extensions Docs + runs-on: ubuntu-latest + steps: + - name: Checkout docs + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + fetch-depth: 0 + path: docs + ref: ${{ env.TARGET_BRANCH }} + + - name: Set up Python 3.11 + uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + with: + python-version: "3.11" + + - name: Generate Extensions documentation + working-directory: docs + run: | + python3 scripts/generate_extensions_docs.py + env: + LOCALSTACK_AUTH_TOKEN: ${{ secrets.LOCALSTACK_AUTH_TOKEN }} + + - name: Check for changes + id: check-for-changes + working-directory: docs + env: + TARGET_BRANCH: ${{ env.TARGET_BRANCH }} + run: | + # Check if there are changed files + # Check against the PR branch if it exists, otherwise against the target branch + mkdir -p resources + FILE_TO_CHECK="src/content/docs/aws/tooling/extensions/official-extensions.md" + (git diff --name-only origin/extensions-docs-auto-updates "$FILE_TO_CHECK" 2>/dev/null || git diff --name-only "origin/$TARGET_BRANCH" "$FILE_TO_CHECK" 2>/dev/null) | tee resources/diff-check.log + echo "diff-count=$(cat resources/diff-check.log | wc -l)" >> $GITHUB_OUTPUT + cat resources/diff-check.log + + - name: Create PR + uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1 + if: ${{ success() && steps.check-for-changes.outputs.diff-count != '0' && steps.check-for-changes.outputs.diff-count != '' }} + with: + path: docs + title: "Update LocalStack Extensions Documentation" + body: | + Automated update of the LocalStack Official Extensions documentation. + + This PR was auto-generated by the `update-extensions-docs` workflow which runs on the 1st of every month. + + **Changes include:** + - Updated list of official and community extensions available on the marketplace + branch: "extensions-docs-auto-updates" + author: "LocalStack Bot " + committer: "LocalStack Bot " + commit-message: "update generated LocalStack Extensions docs" + token: ${{ secrets.PRO_ACCESS_TOKEN }} diff --git a/astro.config.mjs b/astro.config.mjs index 806385428..b6f7e2fc6 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -610,10 +610,6 @@ export default defineConfig({ directory: '/aws/configuration/extensions', }, }, - { - label: 'Official Extensions', - link: 'https://app.localstack.cloud/extensions/library/', - }, ], collapsed: true, }, diff --git a/scripts/generate_extensions_docs.py b/scripts/generate_extensions_docs.py new file mode 100644 index 000000000..392ef721c --- /dev/null +++ b/scripts/generate_extensions_docs.py @@ -0,0 +1,239 @@ +#!/usr/bin/env python3 +""" +Script to auto-generate the LocalStack Official Extensions documentation. + +This script queries the LocalStack Platform API for the list of extensions +available on the marketplace and generates a markdown documentation page with +auto-updating tables of the official and community extensions. + +Usage: + export LOCALSTACK_AUTH_TOKEN=ls-... + python3 scripts/generate_extensions_docs.py + +Requirements: + - A valid LocalStack auth token exposed via the LOCALSTACK_AUTH_TOKEN + environment variable. +""" + +from __future__ import annotations + +import argparse +import base64 +import json +import os +import sys +import urllib.error +import urllib.request +from dataclasses import dataclass +from pathlib import Path + +# Output path for the generated documentation +DEFAULT_OUTPUT_PATH = Path("src/content/docs/aws/tooling/extensions/official-extensions.md") + +# LocalStack Platform API endpoint that returns the extensions marketplace. +MARKETPLACE_URL = "https://api.localstack.cloud/v1/extensions/marketplace" + +REQUEST_TIMEOUT = 30 + + +@dataclass +class Extension: + """Represents a single marketplace extension.""" + + name: str + display_name: str + description: str + author: str + version: str + official: bool + + @classmethod + def from_api(cls, item: dict) -> "Extension": + name = (item.get("name") or "").strip() + return cls( + name=name, + display_name=(item.get("display_name") or name or "Unknown").strip(), + description=(item.get("description") or "").strip() or "No description provided.", + author=(item.get("author") or "Unknown").strip(), + version=(item.get("version") or "").strip() or "—", + official=bool(item.get("official")), + ) + + +def get_auth_token() -> str: + """Read the LocalStack auth token from the environment.""" + token = os.environ.get("LOCALSTACK_AUTH_TOKEN", "").strip() + if not token: + print( + "Error: LOCALSTACK_AUTH_TOKEN is not set. Export a valid LocalStack " + "auth token before running this script.", + file=sys.stderr, + ) + sys.exit(1) + return token + + +def fetch_marketplace(token: str) -> list[Extension]: + """Fetch the marketplace extensions from the LocalStack Platform API.""" + encoded = base64.b64encode(f":{token}".encode()).decode() + request = urllib.request.Request( + MARKETPLACE_URL, + headers={ + "Authorization": f"Basic {encoded}", + "Accept": "application/json", + }, + ) + + try: + with urllib.request.urlopen(request, timeout=REQUEST_TIMEOUT) as response: + payload = json.loads(response.read().decode()) + except urllib.error.HTTPError as exc: + if exc.code in (401, 403): + print( + "Error: Authentication failed when contacting the marketplace API. " + "Ensure LOCALSTACK_AUTH_TOKEN is set correctly.", + file=sys.stderr, + ) + else: + print(f"Error: Marketplace request failed with HTTP {exc.code}.", file=sys.stderr) + sys.exit(1) + except (urllib.error.URLError, TimeoutError) as exc: + print(f"Error: Could not reach the marketplace API: {exc}", file=sys.stderr) + sys.exit(1) + + if not isinstance(payload, list): + print("Error: Unexpected marketplace response format (expected a list).", file=sys.stderr) + sys.exit(1) + + extensions = [ + Extension.from_api(item) + for item in payload + if isinstance(item, dict) and item.get("published", True) + ] + extensions.sort(key=lambda ext: ext.display_name.lower()) + return extensions + + +def _escape_cell(value: str) -> str: + """Escape characters that would break a markdown table cell.""" + return value.replace("|", "\\|").replace("\n", " ").strip() + + +def generate_table(extensions: list[Extension]) -> list[str]: + """Generate a markdown table for a list of extensions.""" + lines = [ + "| Extension | Description | Author | Install |", + "|-----------|-------------|--------|---------|", + ] + for ext in extensions: + name = _escape_cell(ext.display_name) + description = _escape_cell(ext.description) + author = _escape_cell(ext.author) + install = f"`localstack extensions install {ext.name}`" if ext.name else "—" + lines.append(f"| {name} | {description} | {author} | {install} |") + return lines + + +def generate_documentation(extensions: list[Extension]) -> str: + """Generate the complete markdown documentation.""" + official = [ext for ext in extensions if ext.official] + community = [ext for ext in extensions if not ext.official] + + doc_lines = [ + "---", + "title: Official Extensions", + "description: Browse the official and community LocalStack Extensions available on the marketplace.", + "template: doc", + "sidebar:", + " order: 5", + "tags: ['Hobby']", + "---", + "", + "## Introduction", + "", + "The tables below list the extensions currently available on the " + "[LocalStack marketplace](https://app.localstack.cloud/extensions/library), " + "and are kept up to date automatically.", + "", + "You can install any of the extensions below with the LocalStack CLI:", + "", + "```bash", + "localstack extensions install ", + "```", + "", + "See [Managing extensions](/aws/tooling/extensions/managing-extensions) for more details " + "on installing, listing, and removing extensions.", + "", + ":::note", + "This page is auto-generated from the LocalStack marketplace API.", + ":::", + "", + ] + + if official: + doc_lines.extend([ + "## Official Extensions", + "", + "Extensions built and maintained by the LocalStack team.", + "", + ]) + doc_lines.extend(generate_table(official)) + doc_lines.append("") + + if community: + doc_lines.extend([ + "## Community Extensions", + "", + "Extensions contributed and maintained by the LocalStack community and partners.", + "", + ]) + doc_lines.extend(generate_table(community)) + doc_lines.append("") + + return "\n".join(doc_lines) + + +def create_argument_parser() -> argparse.ArgumentParser: + """Create the argument parser for the script.""" + parser = argparse.ArgumentParser( + description="Generate the LocalStack Official Extensions documentation from the marketplace API." + ) + parser.add_argument( + "--output", + "-o", + type=Path, + default=DEFAULT_OUTPUT_PATH, + help=f"Output path for the generated documentation (default: {DEFAULT_OUTPUT_PATH})", + ) + parser.add_argument( + "--dry-run", + action="store_true", + help="Print the documentation to stdout instead of writing to file", + ) + return parser + + +def main() -> None: + """Main entry point for the script.""" + parser = create_argument_parser() + args = parser.parse_args() + + token = get_auth_token() + + print("Fetching extensions from the LocalStack marketplace...", file=sys.stderr) + extensions = fetch_marketplace(token) + print(f"Found {len(extensions)} published extensions.", file=sys.stderr) + + print("Generating documentation...", file=sys.stderr) + documentation = generate_documentation(extensions) + + if args.dry_run: + print(documentation) + else: + args.output.parent.mkdir(parents=True, exist_ok=True) + args.output.write_text(documentation.rstrip() + "\n", encoding="utf-8") + print(f"Documentation written to: {args.output}", file=sys.stderr) + + +if __name__ == "__main__": + main() diff --git a/src/content/docs/aws/tooling/extensions/official-extensions.md b/src/content/docs/aws/tooling/extensions/official-extensions.md new file mode 100644 index 000000000..fc3463cd7 --- /dev/null +++ b/src/content/docs/aws/tooling/extensions/official-extensions.md @@ -0,0 +1,54 @@ +--- +title: Official Extensions +description: Browse the official and community LocalStack Extensions available on the marketplace. +template: doc +sidebar: + order: 5 +tags: ['Hobby'] +--- + +## Introduction + +The tables below list the extensions currently available on the [LocalStack marketplace](https://app.localstack.cloud/extensions/library), and are kept up to date automatically. + +You can install any of the extensions below with the LocalStack CLI: + +```bash +localstack extensions install +``` + +See [Managing extensions](/aws/tooling/extensions/managing-extensions) for more details on installing, listing, and removing extensions. + +:::note +This page is auto-generated from the LocalStack marketplace API. +::: + +## Official Extensions + +Extensions built and maintained by the LocalStack team. + +| Extension | Description | Author | Install | +|-----------|-------------|--------|---------| +| AWS Proxy | Proxy requests from your LocalStack instance to real AWS resources | LocalStack | `localstack extensions install localstack-extension-aws-proxy` | +| Diagnosis Viewer | View the diagnostics endpoint directly in localstack | LocalStack | `localstack extensions install localstack-extension-diagnosis-viewer` | +| Hello World | A minimal LocalStack extension | LocalStack | `localstack extensions install localstack-extension-hello-world` | +| httpbin | A simple HTTP Request & Response Service directly in LocalStack | LocalStack | `localstack extensions install localstack-extension-httpbin` | +| MailHog | Web and API based SMTP testing directly in LocalStack using MailHog | LocalStack | `localstack extensions install localstack-extension-mailhog` | +| Miniflare | This extension makes Miniflare (dev environment for Cloudflare workers) available directly in LocalStack | LocalStack | `localstack extensions install localstack-extension-miniflare` | +| Resource Graph | Altimeter based LocalStack extension that allows you to create and import into neptune a graph of the resources in your LocalStack instance | LocalStack | `localstack extensions install localstack-extension-resource-graph` | +| Stripe | A LocalStack extension that provides a mocked version of Stripe as a service | LocalStack | `localstack extensions install localstack-extension-stripe` | +| Terraform Init Hooks | Use Terraform files as initialization hooks to pre-seed your LocalStack instance automatically | Thomas Rausch | `localstack extensions install localstack-extension-terraform-init` | + +## Community Extensions + +Extensions contributed and maintained by the LocalStack community and partners. + +| Extension | Description | Author | Install | +|-----------|-------------|--------|---------| +| Authress | Add authentication, permissions, and access control to LocalStack | Authress | `localstack extensions install localstack-extension-authress` | +| Claude (Anthropic API) | LocalStack Extension for testing Anthropic Claude API integrations locally | LocalStack Team | `localstack extensions install localstack-claude` | +| Keycloak | LocalStack Extension for developing Keycloak-secured apps locally | LocalStack Team | `localstack extensions install localstack-keycloak` | +| ParadeDB | LocalStack Extension for running ParadeDB search databases locally | LocalStack & ParadeDB | `localstack extensions install localstack-paradedb` | +| TypeDB | LocalStack Extension that facilitates developing TypeDB-based applications locally. | LocalStack & TypeDB | `localstack extensions install localstack-extension-typedb` | +| WireMock | LocalStack Extension that facilitates running WireMock mock APIs locally. | LocalStack & WireMock | `localstack extensions install localstack-wiremock` | +| Xero | LocalStack Extension for developing against the Xero Finance API locally | LocalStack Team | `localstack extensions install localstack-xero` | From ba451e6afec1a7a7d92f0ec1e4d4546a4277b325 Mon Sep 17 00:00:00 2001 From: Harsh Mishra Date: Mon, 6 Jul 2026 02:25:17 -0700 Subject: [PATCH 49/58] Update Azure coverage data (#761) Co-authored-by: LocalStack Bot --- src/data/azure-coverage/Microsoft.App.json | 10 +++++----- src/data/azure-coverage/Microsoft.Compute.json | 10 +++++----- .../azure-coverage/Microsoft.DBforPostgreSQL.json | 14 +++++++------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/data/azure-coverage/Microsoft.App.json b/src/data/azure-coverage/Microsoft.App.json index 109cf99ed..3cb790ef7 100644 --- a/src/data/azure-coverage/Microsoft.App.json +++ b/src/data/azure-coverage/Microsoft.App.json @@ -426,23 +426,23 @@ }, "HttpRouteConfig": { "CreateOrUpdate": { - "implemented": false, + "implemented": true, "pro": true }, "Delete": { - "implemented": false, + "implemented": true, "pro": true }, "Get": { - "implemented": false, + "implemented": true, "pro": true }, "List": { - "implemented": false, + "implemented": true, "pro": true }, "Update": { - "implemented": false, + "implemented": true, "pro": true } }, diff --git a/src/data/azure-coverage/Microsoft.Compute.json b/src/data/azure-coverage/Microsoft.Compute.json index 03c41bc60..3502311a4 100644 --- a/src/data/azure-coverage/Microsoft.Compute.json +++ b/src/data/azure-coverage/Microsoft.Compute.json @@ -764,7 +764,7 @@ "pro": true }, "GetVirtualMachineScaleSetNetworkInterface": { - "implemented": false, + "implemented": true, "pro": true }, "ListCloudServiceNetworkInterfaces": { @@ -784,7 +784,7 @@ "pro": true }, "ListVirtualMachineScaleSetVMNetworkInterfaces": { - "implemented": false, + "implemented": true, "pro": true } }, @@ -1292,7 +1292,7 @@ "pro": true }, "Get": { - "implemented": false, + "implemented": true, "pro": true }, "GetInstanceView": { @@ -1300,7 +1300,7 @@ "pro": true }, "List": { - "implemented": false, + "implemented": true, "pro": true }, "PerformMaintenance": { @@ -1344,7 +1344,7 @@ "pro": true }, "Update": { - "implemented": false, + "implemented": true, "pro": true } }, diff --git a/src/data/azure-coverage/Microsoft.DBforPostgreSQL.json b/src/data/azure-coverage/Microsoft.DBforPostgreSQL.json index 8bd710d25..d781dba87 100644 --- a/src/data/azure-coverage/Microsoft.DBforPostgreSQL.json +++ b/src/data/azure-coverage/Microsoft.DBforPostgreSQL.json @@ -32,11 +32,11 @@ "pro": true }, "AdvancedThreatProtectionSettings_Get": { - "implemented": false, + "implemented": true, "pro": true }, "AdvancedThreatProtectionSettings_ListByServer": { - "implemented": false, + "implemented": true, "pro": true }, "BackupsAutomaticAndOnDemand_Create": { @@ -76,7 +76,7 @@ "pro": true }, "CapturedLogs_ListByServer": { - "implemented": false, + "implemented": true, "pro": true }, "CheckMigrationNameAvailability": { @@ -176,19 +176,19 @@ "pro": true }, "PrivateLinkResources_Get": { - "implemented": false, + "implemented": true, "pro": true }, "PrivateLinkResources_ListByServer": { - "implemented": false, + "implemented": true, "pro": true }, "Replicas_ListByServer": { - "implemented": false, + "implemented": true, "pro": true }, "ServerThreatProtectionSettings_CreateOrUpdate": { - "implemented": false, + "implemented": true, "pro": true }, "Servers_CreateOrUpdate": { From 32f7cebf6073613c68001d1ce23c2957f58d615b Mon Sep 17 00:00:00 2001 From: LocalStack Bot <88328844+localstack-bot@users.noreply.github.com> Date: Mon, 6 Jul 2026 11:26:07 +0200 Subject: [PATCH 50/58] Update CODEOWNERS (#762) Co-authored-by: LocalStack Bot --- CODEOWNERS | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index be65f2ab0..96aa99b17 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -103,7 +103,7 @@ /src/content/docs/aws/services/eks.mdx @nik-localstack @pinzon @quetzalliwrites @HarshCasper # elasticache -/src/content/docs/aws/services/elasticache.mdx @thrau @giograno @silv-io @quetzalliwrites @HarshCasper +/src/content/docs/aws/services/elasticache.mdx @giograno @silv-io @quetzalliwrites @HarshCasper # elb /src/content/docs/aws/services/elb.mdx @nik-localstack @quetzalliwrites @HarshCasper @@ -132,9 +132,6 @@ # iot /src/content/docs/aws/services/iot.mdx @viren-nadkarni @quetzalliwrites @HarshCasper -# kafka -/src/content/docs/aws/services/kafka.mdx @thrau @quetzalliwrites @HarshCasper - # kinesisanalyticsv2 /src/content/docs/aws/services/kinesisanalyticsv2.mdx @viren-nadkarni @quetzalliwrites @HarshCasper @@ -202,7 +199,7 @@ /src/content/docs/aws/services/sns.mdx @bentsku @baermat @quetzalliwrites @HarshCasper # sqs -/src/content/docs/aws/services/sqs.mdx @baermat @thrau @quetzalliwrites @HarshCasper +/src/content/docs/aws/services/sqs.mdx @baermat @quetzalliwrites @HarshCasper # ssm /src/content/docs/aws/services/ssm.mdx @viren-nadkarni @quetzalliwrites @HarshCasper From 3fb5fa39d1ccb7544daf58aa13e1266f57d6fd3e Mon Sep 17 00:00:00 2001 From: Harsh Mishra Date: Mon, 6 Jul 2026 02:26:27 -0700 Subject: [PATCH 51/58] Update CloudFormation coverage data (#763) Co-authored-by: LocalStack Bot --- src/data/cloudformation/coverage.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/cloudformation/coverage.json b/src/data/cloudformation/coverage.json index 6e3202c02..54a7bdb1c 100644 --- a/src/data/cloudformation/coverage.json +++ b/src/data/cloudformation/coverage.json @@ -1,5 +1,5 @@ { - "generated_at": "2026-06-22T06:52:20.753149+00:00", + "generated_at": "2026-07-06T06:35:00.865512+00:00", "database_id": "9b3ebbcc1f6749fb908eb2e3582386b0", "total_resources": 273, "resources": [ From 0cfc233754dfd2364a60876d23ebf07a750398b8 Mon Sep 17 00:00:00 2001 From: Kiah Imani Date: Mon, 6 Jul 2026 05:27:30 -0400 Subject: [PATCH 52/58] DOC-132 Flink containers not created when running in Kubernetes with Docker executor (#666) --- .../docs/aws/services/kinesisanalyticsv2.mdx | 46 +++++++++++++++++-- 1 file changed, 41 insertions(+), 5 deletions(-) diff --git a/src/content/docs/aws/services/kinesisanalyticsv2.mdx b/src/content/docs/aws/services/kinesisanalyticsv2.mdx index 47a526c9b..094a76fb3 100644 --- a/src/content/docs/aws/services/kinesisanalyticsv2.mdx +++ b/src/content/docs/aws/services/kinesisanalyticsv2.mdx @@ -21,6 +21,16 @@ LocalStack lets you to run Flink applications locally and implements several [AW A separate Apache Flink cluster is started in [application mode](https://nightlies.apache.org/flink/flink-docs-release-1.20/docs/deployment/overview/#application-mode) for every Managed Flink application created. Flink cluster deployment on LocalStack consists of two separate containers for [JobManager](https://nightlies.apache.org/flink/flink-docs-release-1.20/docs/concepts/flink-architecture/#jobmanager) and [TaskManager](https://nightlies.apache.org/flink/flink-docs-release-1.20/docs/concepts/flink-architecture/#taskmanagers). +## Deployment Considerations + +The default container runtime for MSF on LocalStack is Docker. +LocalStack creates Flink JobManager and TaskManager containers on the Docker network specified by `MAIN_DOCKER_NETWORK` (defaults to `bridge`). + +**Running LocalStack inside a Kubernetes cluster with the Docker executor is not supported.** +Mounting the host Docker socket (`/var/run/docker.sock`) into a LocalStack pod is not sufficient — the Docker executor cannot create Flink containers in this topology and applications will remain stuck in `STARTING` indefinitely. + +If you are running LocalStack outside of Kubernetes (for example, with Docker Compose or the LocalStack CLI), no additional configuration is required and the Docker executor is used automatically. + ## Getting Started This guide builds a demo Flink application and deploys it to LocalStack. @@ -203,6 +213,10 @@ awslocal kinesisanalyticsv2 describe-application --application-name msaf-app | j ] ``` +:::note +Logs events are reported to CloudWatch every 10 seconds. +::: + Log events can be retrieved from CloudWatch Logs using the appropriate operation. To retrieve all events: @@ -210,10 +224,6 @@ To retrieve all events: awslocal logs get-log-events --log-group-name msaf-log-group --log-stream-name msaf-log-stream ``` -:::note -Logs events are reported to CloudWatch every 10 seconds. -::: - LocalStack reports both Flink application and Flink framework logs to CloudWatch. However, certain extended information such as stack traces may be missing. You may obtain this information by execing into the Flink Docker container created by LocalStack and inspecting `/opt/flink/log`. @@ -260,6 +270,29 @@ awslocal kinesisanalyticsv2 untag-resource \ | 1.18.1 | yes | yes | | 1.15.2 | yes | no | +## Troubleshooting + +### Application stuck in `STARTING` + +If `describe-application` returns `STARTING` indefinitely and no Flink containers appear, the most likely cause is that LocalStack cannot reach the Docker daemon or Kubernetes API to create the Flink JobManager and TaskManager. + +When this occurs, LocalStack logs an internal error after `CLUSTER_READY_WAIT_TIMEOUT` elapses: + +``` +Exception: Error submitting job: Flink cluster is not running +``` + +The application does not automatically transition to `FAILED` — it remains in `STARTING`. +This means IaC tools that use state waiters (such as the Terraform AWS provider or Crossplane) will block until their own timeout expires. + +**Common causes and fixes:** + +- **Running LocalStack inside Kubernetes with the Docker executor** — the Docker executor is not supported in this topology. + See [Deployment Considerations](#deployment-considerations) for details. +- **Wrong or missing Docker network** — if LocalStack is running in a non-default Docker network, set `MAIN_DOCKER_NETWORK` to the name of that network so Flink containers are attached to the correct network. +- **Docker socket not accessible** — confirm that the Docker socket is mounted and functional. + You can verify by listing containers from inside the LocalStack container: `curl --unix-socket /var/run/docker.sock http://localhost/containers/json`. + ## Limitations - Application versions are not maintained @@ -272,7 +305,10 @@ awslocal kinesisanalyticsv2 untag-resource \ The application logging level defaults to `INFO` and can not be overridden. - Parallelism is limited to the default value of 1, with one TaskManager that has one [Task Slot](https://nightlies.apache.org/flink/flink-docs-release-1.20/docs/concepts/flink-architecture/#task-slots-and-resources) allocated. [Parallelism configuration](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_FlinkApplicationConfiguration.html#APIReference-Type-FlinkApplicationConfiguration-ParallelismConfiguration) provided on Flink application creation or update is ignored. +- When a Flink cluster fails to start, the application remains in `STARTING` rather than transitioning to `FAILED`. + Check LocalStack logs and see [Troubleshooting](#troubleshooting) for guidance. +- The Docker executor is not supported when LocalStack runs as a pod inside a Kubernetes cluster. ## API Coverage - + \ No newline at end of file From 90b0c04fd1bb094d6ef6e8494bdd849810fd498e Mon Sep 17 00:00:00 2001 From: Kiah Imani Date: Mon, 6 Jul 2026 05:28:12 -0400 Subject: [PATCH 53/58] S3 Implement Replication (#689) Co-authored-by: Ben Simon Hartung <42031100+bentsku@users.noreply.github.com> --- src/content/docs/aws/services/s3.mdx | 42 ++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/content/docs/aws/services/s3.mdx b/src/content/docs/aws/services/s3.mdx index 3326d2e77..d5400e6c3 100644 --- a/src/content/docs/aws/services/s3.mdx +++ b/src/content/docs/aws/services/s3.mdx @@ -260,6 +260,48 @@ LocalStack supports SSE-C parameter validation for the following S3 APIs: However, LocalStack does not support the actual encryption and decryption of objects using SSE-C. +## S3 Replication + +S3 Replication allows you to automatically copy objects from a source bucket to one or more destination buckets. +Replication can occur within the same region or across regions, and across different accounts. + +LocalStack supports the following replication configurations: + +- **One-way replication**: Objects are replicated from a source bucket to a destination bucket. You can scope replication using prefix-based or tag-based filtering, and optionally override the storage class for objects written to the destination bucket. +- **Two-way replication**: Both buckets are configured as source and destination for each other, and replication is configured to work in both directions. + +### IAM enforcement + +LocalStack supports IAM enforcement for S3 replication. +IAM permissions are evaluated in the context of each replication task using the IAM engine directly, which mirrors how AWS itself handles replication permissions. + +### Metadata replication + +LocalStack supports replication of object metadata, specifically tags and Object Lock settings. Metadata replication operates in two modes: + +- **Default metadata replication**: When a source object's metadata is modified, those changes are automatically propagated to all of its replicas. This behavior is enabled by default and requires no additional configuration. +- **Replica metadata synchronization**: When enabled on the destination bucket, metadata changes made directly to a replica are synced back to the source object. This applies only when two-way replication is configured. See [Replication for metadata changes](https://docs.aws.amazon.com/AmazonS3/latest/userguide/replication-for-metadata-changes.html) in the AWS documentation for more details. + +### ReplicationStatus + +Replicated objects are assigned a `ReplicationStatus` field, which you can inspect with `GetObject` or `HeadObject`. +The possible values follow AWS semantics: + +| Status | Meaning | +|---|---| +| `PENDING` | Replication has been queued but not yet completed | +| `COMPLETED` | Object was successfully replicated to the destination | +| `FAILED` | Replication could not be completed | +| `REPLICA` | This object is itself a copy created by replication | + +:::note +The following replication features are not yet supported in LocalStack and will be available in a future release: + +- **`s3:ReplicateTags` deny evaluation**: Explicitly denying `s3:ReplicateTags` will not cause replication to be denied if the object has tags. +- **KMS-encrypted object replication**: Objects encrypted with customer-provided KMS keys are not replicated, even when replication of KMS-encrypted objects is explicitly configured. See [Replicating objects created with server-side encryption using AWS KMS keys](https://docs.aws.amazon.com/AmazonS3/latest/userguide/replication-config-for-kms-objects.html#replications) in the AWS documentation for more details. +- **ACL replication**: Replication of Access Control Lists is not currently supported. +::: + ## Resource Browser The LocalStack Web Application provides a [Resource Browser](/aws/connecting/console/resource-browser) for managing S3 buckets & configurations. From f9092f9263980f6b5996e0575bd7e0080ffe0017 Mon Sep 17 00:00:00 2001 From: Harsh Mishra Date: Mon, 6 Jul 2026 02:33:34 -0700 Subject: [PATCH 54/58] document MNP jobs execution (#709) --- src/content/docs/aws/services/batch.mdx | 68 +++++++++++++++++++++++-- 1 file changed, 63 insertions(+), 5 deletions(-) diff --git a/src/content/docs/aws/services/batch.mdx b/src/content/docs/aws/services/batch.mdx index 85cfd30ee..6d85d2aba 100644 --- a/src/content/docs/aws/services/batch.mdx +++ b/src/content/docs/aws/services/batch.mdx @@ -188,13 +188,59 @@ awslocal batch submit-job \ --container-overrides '{"command":["sh", "-c", "sleep 5; pwd"]}' ``` -## Current Limitations +## Multi-node parallel jobs -LocalStack simulates the execution of ECS-based AWS Batch jobs using the local ECS runtime. No real infrastructure is created or managed. +LocalStack supports [AWS Batch multi-node parallel (MNP) jobs](https://docs.aws.amazon.com/batch/latest/userguide/multi-node-parallel-jobs.html), which run a single job across a main node and one or more worker nodes. +The main node starts first, and the workers follow once it is running. Each worker receives the main node's private IP so the nodes can communicate. -Array jobs are supported in sequential mode only. +MNP jobs run on EC2-backed compute environments only. Fargate is not supported. + +To run one, register a job definition with `--type multinode` and a `nodeProperties` object that sets the main node, the number of nodes, and a container per node range: + +```bash +awslocal batch register-job-definition \ + --job-definition-name mnp-jobdefn \ + --type multinode \ + --node-properties '{ + "mainNode": 0, + "numNodes": 2, + "nodeRangeProperties": [ + { + "targetNodes": "0:1", + "container": { + "image": "busybox", + "command": ["sh", "-c", "echo node $AWS_BATCH_JOB_NODE_INDEX; sleep 10"], + "resourceRequirements": [ + {"type": "MEMORY", "value": "512"}, + {"type": "VCPU", "value": "1"} + ] + } + } + ] + }' +``` + +Then submit it to an EC2-backed queue: + +```bash +awslocal batch submit-job \ + --job-name mnp-job \ + --job-queue mnp-queue \ + --job-definition mnp-jobdefn +``` + +The submitted job is the parent. Each node is addressable as a child job using the `#` notation, which you can inspect with `describe-jobs`: + +```bash +awslocal batch describe-jobs --jobs "#0" "#1" +``` + +Each node also receives additional [environment variables](#environment-variables), such as `AWS_BATCH_JOB_NODE_INDEX` and `AWS_BATCH_JOB_MAIN_NODE_PRIVATE_IPV4_ADDRESS`, that let the nodes coordinate. + +## Environment variables + +LocalStack injects a subset of the Batch environment variables into each job container: -A subset of environment variables is supported, including: - `AWS_BATCH_CE_NAME` - `AWS_BATCH_JOB_ARRAY_INDEX` - `AWS_BATCH_JOB_ARRAY_SIZE` @@ -202,11 +248,23 @@ A subset of environment variables is supported, including: - `AWS_BATCH_JOB_ID` - `AWS_BATCH_JQ_NAME` +[Multi-node parallel jobs](#multi-node-parallel-jobs) receive the following additional variables on each node: + +- `AWS_BATCH_JOB_NODE_INDEX` — the index of the current node. +- `AWS_BATCH_JOB_NUM_NODES` — the total number of nodes in the job. +- `AWS_BATCH_JOB_MAIN_NODE_INDEX` — the index of the main node. +- `AWS_BATCH_JOB_MAIN_NODE_PRIVATE_IPV4_ADDRESS` — the private IP of the main node, set on worker nodes so they can connect back to the main node. + +## Current Limitations + +LocalStack simulates the execution of ECS-based AWS Batch jobs using the local ECS runtime. No real infrastructure is created or managed. + +Array jobs are supported in sequential mode only. + The configuration variable `ECS_DOCKER_FLAGS` can be used to pass additional Docker flags to the container runtime. Setting `ECS_TASK_EXECUTOR=kubernetes` is supported as an alternative backend, though Kubernetes execution is experimental and may not support all features. - ## API Coverage From 382a0b4cb5e86f4d907e3e4937daf0d249522e2a Mon Sep 17 00:00:00 2001 From: Quetzalli Date: Mon, 6 Jul 2026 12:10:31 +0200 Subject: [PATCH 55/58] (fix) apply DRY principle to remove duplicate content from MCP section, while retaining core value --- src/content/docs/aws/getting-started/ai-workflows.mdx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/content/docs/aws/getting-started/ai-workflows.mdx b/src/content/docs/aws/getting-started/ai-workflows.mdx index f58bb7b37..091267b3c 100644 --- a/src/content/docs/aws/getting-started/ai-workflows.mdx +++ b/src/content/docs/aws/getting-started/ai-workflows.mdx @@ -39,16 +39,18 @@ For manual setup of the MCP server and skills, you can follow the steps below. ## Connect an MCP client -The LocalStack MCP Server connects MCP-compatible clients to your LocalStack environment. Once configured, your AI assistant can use LocalStack tools to start the container, deploy infrastructure, run AWS CLI commands, inspect logs, manage state, and query resources. The quickest way to get started with the MCP server is to use the interactive setup wizard: +The LocalStack MCP Server connects MCP-compatible clients to your LocalStack environment. Once configured, your AI assistant can use LocalStack tools to start the container, deploy infrastructure, run AWS CLI commands, inspect logs, manage state, and query resources. + +Start the MCP server with an interactive setup wizard: ```bash npx -y @localstack/localstack-mcp-server init ``` -The wizard detects your installed clients, asks how you want to run the server, and writes the configuration for you. You need a valid [Auth Token](/aws/getting-started/auth-token/) to configure the server. - :::note -The MCP server runs locally and talks to a LocalStack instance. Your AI assistant is the MCP client. For detailed setup instructions and the full tool reference, see the [LocalStack MCP Server guide](/aws/tooling/mcp-server/). +The MCP server runs locally and talks to a LocalStack instance. Your AI assistant is the MCP client. For full installation instructions, detailed setup, and the full tool reference, see the [LocalStack MCP Server guide](/aws/tooling/mcp-server/). + +You need a valid [Auth Token](/aws/getting-started/auth-token/) to configure the server. ::: ## Use agent skills From 394bfc0aa369909648e0e714f8c0f289ec70d9a3 Mon Sep 17 00:00:00 2001 From: Quetzalli Date: Wed, 8 Jul 2026 10:45:34 +0200 Subject: [PATCH 56/58] DOCS (hotfix) aws docs misc updates + Peter's contribution to Information Architecture (#766) Co-authored-by: Josh Co-authored-by: Harsh Mishra Co-authored-by: Viren Nadkarni Co-authored-by: Peter Smith Co-authored-by: Brian Rinaldi Co-authored-by: Cursor --- astro.config.mjs | 212 +- public/_redirects | 1812 +++++++++-------- public/js/icon-loader.js | 12 +- src/assets/images/CIPipelines_Color.svg | 7 + src/assets/images/Connecting_Color.svg | 8 + .../images/OrganizationsAdmin_Color.svg | 6 + src/assets/images/Tutorials_Color.svg | 7 + src/assets/images/users.svg | 6 + .../bitbucket.md | 0 .../circleci.md | 2 +- .../codebuild.md | 2 +- .../github-actions.md | 0 .../gitlab-ci.md | 0 .../index.md | 0 .../travis-ci.md | 0 .../docs/aws/configuration/config/index.md | 13 - .../config/internal-endpoints.md | 37 - src/content/docs/aws/configuration/index.mdx | 27 - .../docs/aws/configuration/web-app/index.md | 11 - .../docs/aws/connecting/aws-sdks/dotnet.md | 2 +- .../docs/aws/connecting/aws-sdks/index.mdx | 2 +- .../aws/connecting/aws-sdks/python-boto3.md | 2 +- .../console}/instance-management.md | 14 +- .../connecting/console/resource-browser.md | 2 +- .../config => connecting}/credentials.md | 2 +- .../serverless-framework.md | 2 +- .../advanced}/arm64-support.md | 4 +- .../advanced}/cross-account-access.md | 4 +- .../advanced}/filesystem.mdx | 6 +- .../docs/aws/customization/advanced/index.mdx | 17 + .../advanced}/initialization-hooks.mdx | 8 +- .../advanced}/multi-account-setups.md | 4 +- .../advanced}/regions-coverage.md | 4 +- .../advanced}/usage-tracking.md | 6 +- .../configuration-options.md} | 36 +- src/content/docs/aws/customization/index.mdx | 22 + .../integrations/app-frameworks/architect.md | 0 .../integrations/app-frameworks/aspire.md | 4 +- .../app-frameworks}/docker-compose.yml | 0 .../integrations/app-frameworks/index.md | 0 .../integrations/app-frameworks/quarkus.md | 0 .../selfmanaged-kafka-cluster.md | 4 +- .../app-frameworks/spring-cloud-function.mdx | 0 .../extensions/developing-extensions.mdx | 0 .../extensions/extensions-library.md | 0 .../integrations}/extensions/index.md | 2 +- .../integrations}/extensions/mailhog.md | 4 +- .../extensions/managing-extensions.mdx | 4 +- .../aws/customization/integrations/index.mdx | 30 + .../integrations}/localstack-sdks/index.md | 0 .../integrations}/localstack-sdks/java-sdk.md | 0 .../localstack-sdks/python-sdk.md | 0 .../localstack-sdks}/testing-utils.md | 0 .../integrations/testing/index.md | 0 .../testing/lambdatest-hyperexecute.md | 0 .../integrations/testing/testcontainers.mdx | 0 .../kubernetes/concepts.md | 4 +- .../kubernetes/configuration.md | 6 +- .../kubernetes/deploy-helm-chart.md | 0 .../kubernetes}/eksctl.mdx | 2 +- .../kubernetes/faq.md | 6 +- .../kubernetes/index.md | 2 +- .../kubernetes/kubernetes-executor.md | 0 .../kubernetes/kubernetes-operator.mdx | 2 +- .../kubernetes/limitations.md | 2 +- .../kubernetes}/openshift.md | 2 +- .../kubernetes/pod-configuration.md | 4 +- .../config => customization}/logging.md | 6 +- .../networking/accessing-endpoint-url.mdx | 4 +- .../networking/accessing-resources-created.md | 6 +- .../networking}/dns-server.md | 8 +- .../networking/external-port-range.mdx | 0 .../networking/https-tls-support.mdx | 4 +- .../networking/index.mdx | 30 +- .../networking/internal-endpoints.md | 2 +- .../networking}/localsurf.md | 2 + .../transparent-endpoint-injection.md | 12 +- .../other-installations}/devcontainers.mdx | 4 +- .../other-installations}/docker-images.md | 2 +- .../other-installations}/enterprise-image.md | 4 +- .../other-installations/index.mdx | 15 + .../localstack-docker-extension.md | 2 +- .../other-installations}/podman.md | 2 +- .../other-installations}/rancher-desktop.mdx | 2 +- .../lambda-tools/remote-debugging.mdx | 4 +- .../running-localstack}/localstack-desktop.md | 0 .../running-localstack/mcp-server.mdx | 6 +- .../custom-tls-certificates.mdx | 6 +- .../developer-tools/snapshots/cloud-pods.mdx | 10 +- src/content/docs/aws/enterprise/index.mdx | 31 - .../docs/aws/getting-started/auth-token.mdx | 6 +- src/content/docs/aws/getting-started/faq.mdx | 10 +- .../docs/aws/getting-started/installation.mdx | 22 +- .../docs/aws/getting-started/quickstart.mdx | 7 +- src/content/docs/aws/index.mdx | 42 +- .../docs/aws/integrations/containers/index.md | 19 - src/content/docs/aws/integrations/index.mdx | 37 - .../docs/aws/integrations/messaging/index.md | 11 - .../accounts.md | 0 .../docs/aws/organizations-admin/index.mdx | 25 + .../managing-users-licenses.md | 0 .../sso/azure-ad.md | 2 + .../sso/index.md | 2 + .../sso/scim.mdx | 4 +- .../stack-insights.md | 0 .../workspaces.md | 0 .../docs/aws/services/cloudformation.mdx | 4 +- src/content/docs/aws/services/cloudfront.mdx | 2 +- src/content/docs/aws/services/cognito-idp.mdx | 8 +- src/content/docs/aws/services/docdb.mdx | 2 +- src/content/docs/aws/services/ec2.mdx | 22 +- src/content/docs/aws/services/ecs.mdx | 2 +- src/content/docs/aws/services/eks.mdx | 6 +- src/content/docs/aws/services/elasticache.mdx | 2 +- src/content/docs/aws/services/emr.mdx | 2 +- src/content/docs/aws/services/es.mdx | 2 +- src/content/docs/aws/services/lambda.mdx | 6 +- src/content/docs/aws/services/memorydb.mdx | 2 +- src/content/docs/aws/services/mwaa.mdx | 2 +- src/content/docs/aws/services/neptune.mdx | 2 +- src/content/docs/aws/services/opensearch.mdx | 6 +- .../docs/aws/services/organizations.mdx | 40 +- src/content/docs/aws/services/route53.mdx | 6 +- src/content/docs/aws/services/s3.mdx | 2 +- src/content/docs/aws/services/ses.mdx | 4 +- src/content/docs/aws/services/sqs.mdx | 2 +- src/content/docs/aws/services/transcribe.mdx | 2 +- .../docs/aws/tutorials/elb-load-balancing.mdx | 2 +- .../tutorials/lambda-ecr-container-images.mdx | 2 +- .../docs/aws/tutorials/route-53-failover.mdx | 2 +- ...orm-with-testcontainers-and-localstack.mdx | 6 +- .../docs/azure/getting-started/auth-token.mdx | 4 +- .../snowflake/getting-started/auth-token.mdx | 4 +- src/data/licensing/current-plans.json | 4 +- src/styles/custom.css | 13 + 135 files changed, 1539 insertions(+), 1350 deletions(-) create mode 100644 src/assets/images/CIPipelines_Color.svg create mode 100644 src/assets/images/Connecting_Color.svg create mode 100644 src/assets/images/OrganizationsAdmin_Color.svg create mode 100644 src/assets/images/Tutorials_Color.svg create mode 100644 src/assets/images/users.svg rename src/content/docs/aws/{integrations/continuous-integration => ci-pipelines}/bitbucket.md (100%) rename src/content/docs/aws/{integrations/continuous-integration => ci-pipelines}/circleci.md (99%) rename src/content/docs/aws/{integrations/continuous-integration => ci-pipelines}/codebuild.md (98%) rename src/content/docs/aws/{integrations/continuous-integration => ci-pipelines}/github-actions.md (100%) rename src/content/docs/aws/{integrations/continuous-integration => ci-pipelines}/gitlab-ci.md (100%) rename src/content/docs/aws/{integrations/continuous-integration => ci-pipelines}/index.md (100%) rename src/content/docs/aws/{integrations/continuous-integration => ci-pipelines}/travis-ci.md (100%) delete mode 100644 src/content/docs/aws/configuration/config/index.md delete mode 100644 src/content/docs/aws/configuration/config/internal-endpoints.md delete mode 100644 src/content/docs/aws/configuration/index.mdx delete mode 100644 src/content/docs/aws/configuration/web-app/index.md rename src/content/docs/aws/{configuration/web-app => connecting/console}/instance-management.md (75%) rename src/content/docs/aws/{configuration/config => connecting}/credentials.md (95%) rename src/content/docs/aws/{configuration/config => customization/advanced}/arm64-support.md (97%) rename src/content/docs/aws/{configuration/config => customization/advanced}/cross-account-access.md (97%) rename src/content/docs/aws/{configuration/config => customization/advanced}/filesystem.mdx (95%) create mode 100644 src/content/docs/aws/customization/advanced/index.mdx rename src/content/docs/aws/{configuration/config => customization/advanced}/initialization-hooks.mdx (96%) rename src/content/docs/aws/{configuration/config => customization/advanced}/multi-account-setups.md (95%) rename src/content/docs/aws/{configuration/config => customization/advanced}/regions-coverage.md (96%) rename src/content/docs/aws/{configuration/config => customization/advanced}/usage-tracking.md (95%) rename src/content/docs/aws/{configuration/config/configuration.md => customization/configuration-options.md} (97%) create mode 100644 src/content/docs/aws/customization/index.mdx rename src/content/docs/aws/{ => customization}/integrations/app-frameworks/architect.md (100%) rename src/content/docs/aws/{ => customization}/integrations/app-frameworks/aspire.md (96%) rename src/content/docs/aws/{integrations/messaging => customization/integrations/app-frameworks}/docker-compose.yml (100%) rename src/content/docs/aws/{ => customization}/integrations/app-frameworks/index.md (100%) rename src/content/docs/aws/{ => customization}/integrations/app-frameworks/quarkus.md (100%) rename src/content/docs/aws/{integrations/messaging => customization/integrations/app-frameworks}/selfmanaged-kafka-cluster.md (91%) rename src/content/docs/aws/{ => customization}/integrations/app-frameworks/spring-cloud-function.mdx (100%) rename src/content/docs/aws/{configuration => customization/integrations}/extensions/developing-extensions.mdx (100%) rename src/content/docs/aws/{configuration => customization/integrations}/extensions/extensions-library.md (100%) rename src/content/docs/aws/{configuration => customization/integrations}/extensions/index.md (87%) rename src/content/docs/aws/{configuration => customization/integrations}/extensions/mailhog.md (93%) rename src/content/docs/aws/{configuration => customization/integrations}/extensions/managing-extensions.mdx (98%) create mode 100644 src/content/docs/aws/customization/integrations/index.mdx rename src/content/docs/aws/{configuration => customization/integrations}/localstack-sdks/index.md (100%) rename src/content/docs/aws/{configuration => customization/integrations}/localstack-sdks/java-sdk.md (100%) rename src/content/docs/aws/{configuration => customization/integrations}/localstack-sdks/python-sdk.md (100%) rename src/content/docs/aws/{configuration => customization/integrations/localstack-sdks}/testing-utils.md (100%) rename src/content/docs/aws/{ => customization}/integrations/testing/index.md (100%) rename src/content/docs/aws/{ => customization}/integrations/testing/lambdatest-hyperexecute.md (100%) rename src/content/docs/aws/{ => customization}/integrations/testing/testcontainers.mdx (100%) rename src/content/docs/aws/{enterprise => customization}/kubernetes/concepts.md (96%) rename src/content/docs/aws/{enterprise => customization}/kubernetes/configuration.md (96%) rename src/content/docs/aws/{enterprise => customization}/kubernetes/deploy-helm-chart.md (100%) rename src/content/docs/aws/{integrations/containers => customization/kubernetes}/eksctl.mdx (99%) rename src/content/docs/aws/{enterprise => customization}/kubernetes/faq.md (97%) rename src/content/docs/aws/{enterprise => customization}/kubernetes/index.md (96%) rename src/content/docs/aws/{enterprise => customization}/kubernetes/kubernetes-executor.md (100%) rename src/content/docs/aws/{enterprise => customization}/kubernetes/kubernetes-operator.mdx (97%) rename src/content/docs/aws/{enterprise => customization}/kubernetes/limitations.md (98%) rename src/content/docs/aws/{integrations/containers => customization/kubernetes}/openshift.md (99%) rename src/content/docs/aws/{enterprise => customization}/kubernetes/pod-configuration.md (95%) rename src/content/docs/aws/{configuration/config => customization}/logging.md (91%) rename src/content/docs/aws/{configuration => customization}/networking/accessing-endpoint-url.mdx (97%) rename src/content/docs/aws/{configuration => customization}/networking/accessing-resources-created.md (90%) rename src/content/docs/aws/{configuration => customization/networking}/dns-server.md (97%) rename src/content/docs/aws/{configuration => customization}/networking/external-port-range.mdx (100%) rename src/content/docs/aws/{configuration => customization}/networking/https-tls-support.mdx (90%) rename src/content/docs/aws/{configuration => customization}/networking/index.mdx (72%) rename src/content/docs/aws/{configuration => customization}/networking/internal-endpoints.md (96%) rename src/content/docs/aws/{configuration => customization/networking}/localsurf.md (99%) rename src/content/docs/aws/{configuration => customization}/networking/transparent-endpoint-injection.md (91%) rename src/content/docs/aws/{integrations/containers => customization/other-installations}/devcontainers.mdx (98%) rename src/content/docs/aws/{configuration/config => customization/other-installations}/docker-images.md (98%) rename src/content/docs/aws/{enterprise => customization/other-installations}/enterprise-image.md (94%) create mode 100644 src/content/docs/aws/customization/other-installations/index.mdx rename src/content/docs/aws/{configuration => customization/other-installations}/localstack-docker-extension.md (97%) rename src/content/docs/aws/{configuration/config => customization/other-installations}/podman.md (98%) rename src/content/docs/aws/{integrations/containers => customization/other-installations}/rancher-desktop.mdx (98%) rename src/content/docs/aws/{configuration/web-app => developer-tools/running-localstack}/localstack-desktop.md (100%) delete mode 100644 src/content/docs/aws/enterprise/index.mdx delete mode 100644 src/content/docs/aws/integrations/containers/index.md delete mode 100644 src/content/docs/aws/integrations/index.mdx delete mode 100644 src/content/docs/aws/integrations/messaging/index.md rename src/content/docs/aws/{configuration/web-app => organizations-admin}/accounts.md (100%) create mode 100644 src/content/docs/aws/organizations-admin/index.mdx rename src/content/docs/aws/{configuration/web-app => organizations-admin}/managing-users-licenses.md (100%) rename src/content/docs/aws/{enterprise => organizations-admin}/sso/azure-ad.md (98%) rename src/content/docs/aws/{enterprise => organizations-admin}/sso/index.md (99%) rename src/content/docs/aws/{enterprise => organizations-admin}/sso/scim.mdx (99%) rename src/content/docs/aws/{configuration/web-app => organizations-admin}/stack-insights.md (100%) rename src/content/docs/aws/{configuration/web-app => organizations-admin}/workspaces.md (100%) diff --git a/astro.config.mjs b/astro.config.mjs index b6f7e2fc6..6095951a4 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -453,6 +453,10 @@ export default defineConfig({ }, ], }, + { + label: 'Credentials', + slug: 'aws/connecting/credentials', + }, ], }, { @@ -483,6 +487,10 @@ export default defineConfig({ label: 'LocalStack MCP Server', slug: 'aws/developer-tools/running-localstack/mcp-server', }, + { + label: 'LocalStack Desktop', + slug: 'aws/developer-tools/running-localstack/localstack-desktop', + }, ], }, { @@ -551,32 +559,92 @@ export default defineConfig({ ], }, { - label: 'Configuration', + label: 'CI Pipelines', + collapsed: true, + items: [{ autogenerate: { directory: '/aws/ci-pipelines' } }], + }, + { + label: 'Customization', collapsed: true, items: [ { label: 'Overview', - slug: 'aws/configuration', + slug: 'aws/customization', + }, + { + label: 'Configuration Options', + slug: 'aws/customization/configuration-options', }, { - label: 'LocalStack Web App', + label: 'Logging', + slug: 'aws/customization/logging', + }, + { + label: 'Kubernetes', collapsed: true, items: [ { autogenerate: { - directory: '/aws/configuration/web-app', + directory: '/aws/customization/kubernetes', }, }, ], }, { - label: 'Config', + label: 'Integrations', collapsed: true, items: [ { - autogenerate: { - directory: '/aws/configuration/config', - }, + label: 'Overview', + slug: 'aws/customization/integrations', + }, + { + label: 'LocalStack Extensions', + collapsed: true, + items: [ + { + autogenerate: { + directory: '/aws/customization/integrations/extensions', + }, + }, + { + label: 'Official Extensions', + link: 'https://app.localstack.cloud/extensions/library/', + }, + ], + }, + { + label: 'LocalStack SDKs', + collapsed: true, + items: [ + { + autogenerate: { + directory: '/aws/customization/integrations/localstack-sdks', + }, + }, + ], + }, + { + label: 'App Frameworks', + collapsed: true, + items: [ + { + autogenerate: { + directory: '/aws/customization/integrations/app-frameworks', + }, + }, + ], + }, + { + label: 'Testing', + collapsed: true, + items: [ + { + autogenerate: { + directory: '/aws/customization/integrations/testing', + }, + }, + ], }, ], }, @@ -586,110 +654,52 @@ export default defineConfig({ items: [ { autogenerate: { - directory: '/aws/configuration/networking', + directory: '/aws/customization/networking', }, }, ], }, { - label: 'LocalStack SDKs', + label: 'Other Installations', collapsed: true, items: [ { - autogenerate: { - directory: '/aws/configuration/localstack-sdks', - }, + label: 'Overview', + slug: 'aws/customization/other-installations', }, - ], - }, - { - label: 'Extensions', - items: [ { - autogenerate: { - directory: '/aws/configuration/extensions', - }, + label: 'Docker Images', + slug: 'aws/customization/other-installations/docker-images', }, - ], - collapsed: true, - }, - { - label: 'DNS Server', - slug: 'aws/configuration/dns-server', - }, - { - label: 'Testing Utils', - slug: 'aws/configuration/testing-utils', - }, - { - label: 'LocalStack Docker Extension', - slug: 'aws/configuration/localstack-docker-extension', - }, - { - label: 'LocalSurf', - slug: 'aws/configuration/localsurf', - }, - ], - }, - { - label: 'Integrations', - collapsed: true, - items: [ - { - label: 'Overview', - slug: 'aws/integrations', - }, - { - label: 'Continuous Integration', - collapsed: true, - items: [ { - autogenerate: { - directory: '/aws/integrations/continuous-integration', - }, + label: 'Enterprise Image', + slug: 'aws/customization/other-installations/enterprise-image', }, - ], - }, - { - label: 'Containers', - collapsed: true, - items: [ { - autogenerate: { - directory: '/aws/integrations/containers', - }, + label: 'Podman', + slug: 'aws/customization/other-installations/podman', }, - ], - }, - { - label: 'App Frameworks', - collapsed: true, - items: [ { - autogenerate: { - directory: '/aws/integrations/app-frameworks', - }, + label: 'Rancher Desktop', + slug: 'aws/customization/other-installations/rancher-desktop', }, - ], - }, - { - label: 'Messaging', - collapsed: true, - items: [ { - autogenerate: { - directory: '/aws/integrations/messaging', - }, + label: 'DevContainers', + slug: 'aws/customization/other-installations/devcontainers', + }, + { + label: 'LocalStack Docker Extension', + slug: 'aws/customization/other-installations/localstack-docker-extension', }, ], }, { - label: 'Testing', + label: 'Advanced Features', collapsed: true, items: [ { autogenerate: { - directory: '/aws/integrations/testing', + directory: '/aws/customization/advanced', }, }, ], @@ -697,31 +707,37 @@ export default defineConfig({ ], }, { - label: 'Enterprise', + label: 'Organizations & Admin', collapsed: true, items: [ { label: 'Overview', - slug: 'aws/enterprise', + slug: 'aws/organizations-admin', }, { - label: 'Kubernetes', - collapsed: true, - items: [ - { - autogenerate: { directory: '/aws/enterprise/kubernetes' }, - }, - ], + label: 'Accounts', + slug: 'aws/organizations-admin/accounts', + }, + { + label: 'Workspace', + slug: 'aws/organizations-admin/workspaces', + }, + { + label: 'Users and Licenses', + slug: 'aws/organizations-admin/managing-users-licenses', }, { label: 'Single Sign-On', + collapsed: true, items: [ - { autogenerate: { directory: '/aws/enterprise/sso' } }, + { + autogenerate: { directory: '/aws/organizations-admin/sso' }, + }, ], }, { - label: 'Enterprise Image', - slug: 'aws/enterprise/enterprise-image', + label: 'Stack Insights', + slug: 'aws/organizations-admin/stack-insights', }, ], }, diff --git a/public/_redirects b/public/_redirects index 2fcbfbf92..06a227afc 100644 --- a/public/_redirects +++ b/public/_redirects @@ -1,824 +1,824 @@ -/legal/third-party-software-tools/ /aws/legal/third-party-software-tools 301 -/references/coverage/coverage_elb/ /aws/services/elb 301 -/user-guide/aws/batch/ /aws/services/batch 301 -/references/coverage/coverage_scheduler/ /aws/services/scheduler 301 -/user-guide/extensions/ /aws/configuration/extensions 301 -/tutorials/s3-static-website-terraform/ /aws/tutorials/s3-static-website-terraform 301 +/legal/third-party-software-tools/ /aws/legal/third-party-software-tools/ 301 +/references/coverage/coverage_elb/ /aws/services/elb/ 301 +/user-guide/aws/batch/ /aws/services/batch/ 301 +/references/coverage/coverage_scheduler/ /aws/services/scheduler/ 301 +/user-guide/extensions/ /aws/customization/integrations/extensions/ 301 +/tutorials/s3-static-website-terraform/ /aws/tutorials/s3-static-website-terraform/ 301 /references/coverage/coverage_sso-admin/ /aws/services/sso-admin/ 301 -/references/coverage/coverage_rds-data/ /aws/services/rds 301 -/references/coverage/coverage_ec2/ /aws/services/ec2 301 -/references/licensing/ /aws/licensing 301 -/legal/ /aws/legal/third-party-software-tools 301 -/references/coverage/coverage_iotwireless/ /aws/services/iotwireless 301 -/references/coverage/coverage_mwaa/ /aws/services/mwaa 301 +/references/coverage/coverage_rds-data/ /aws/services/rds/ 301 +/references/coverage/coverage_ec2/ /aws/services/ec2/ 301 +/references/licensing/ /aws/licensing/ 301 +/legal/ /aws/legal/third-party-software-tools/ 301 +/references/coverage/coverage_iotwireless/ /aws/services/iotwireless/ 301 +/references/coverage/coverage_mwaa/ /aws/services/mwaa/ 301 /applications/amazon-rds-initialization-using-cdk-lambda-ecr-and-secrets-manager/ https://github.com/localstack-samples/sample-cdk-rds 301 -/references/coverage/coverage_pipes/ /aws/services/pipes 301 -/user-guide/state-management/persistence/ /aws/developer-tools/snapshots/persistence 301 -/references/coverage/coverage_mq/ /aws/services/mq 301 +/references/coverage/coverage_pipes/ /aws/services/pipes/ 301 +/user-guide/state-management/persistence/ /aws/developer-tools/snapshots/persistence/ 301 +/references/coverage/coverage_mq/ /aws/services/mq/ 301 /academy/localstack-101/what-is-localstack/ https://www.youtube.com/watch?list=PLTew28KOwGxPqbkFiW518eeIfiV495bm0&v=B2EML5L3-tw&feature=youtu.be 301 -/references/coverage/coverage_xray/ /aws/services/xray 301 -/references/coverage/coverage_cognito-identity/ /aws/services/cognito-idp 301 -/user-guide/aws/ecs/ /aws/services/ecs 301 -/references/usage-tracking/ /aws/configuration/config/usage-tracking 301 -/user-guide/aws/dms/ /aws/services/dms 301 -/references/coverage/coverage_managedblockchain/ /aws/services/managedblockchain 301 +/references/coverage/coverage_xray/ /aws/services/xray/ 301 +/references/coverage/coverage_cognito-identity/ /aws/services/cognito-idp/ 301 +/user-guide/aws/ecs/ /aws/services/ecs/ 301 +/references/usage-tracking/ /aws/customization/advanced/usage-tracking/ 301 +/user-guide/aws/dms/ /aws/services/dms/ 301 +/references/coverage/coverage_managedblockchain/ /aws/services/managedblockchain/ 301 /applications/search-application-with-lambda-kinesis-firehose-elasticsearch-s3/ https://github.com/localstack-samples/sample-fuzzy-movie-search-lambda-kinesis-elasticsearch 301 -/references/regions-coverage/ /aws/configuration/config/regions-coverage/ 301 -/tutorials/elb-load-balancing/ /aws/tutorials/elb-load-balancing 301 -/references/docker-images/ /aws/configuration/config/docker-images 301 -/user-guide/aws/eks/ /aws/services/eks 301 +/references/regions-coverage/ /aws/customization/advanced/regions-coverage/ 301 +/tutorials/elb-load-balancing/ /aws/tutorials/elb-load-balancing/ 301 +/references/docker-images/ /aws/customization/other-installations/docker-images/ 301 +/user-guide/aws/eks/ /aws/services/eks/ 301 /applications/appsync-graphql-apis-for-dynamodb-and-rds-aurora-postgresql/ https://github.com/localstack-samples/sample-appsync-graphql-api 301 -/user-guide/aws/cloudfront/ /aws/services/cloudfront 301 +/user-guide/aws/cloudfront/ /aws/services/cloudfront/ 301 /applications/note-taking-application-using-aws-sdk-for-javascript/ https://github.com/localstack-samples/sample-notes-app-dynamodb-lambda-apigateway 301 -/user-guide/state-management/export-import-state/ /aws/developer-tools/snapshots/export-import-state 301 -/references/coverage/coverage_s3control/ /aws/services/s3 301 -/references/custom-tls-certificates/ /aws/developer-tools/security-testing/custom-tls-certificates 301 -/references/coverage/coverage_codecommit/ /aws/services/codecommit 301 -/user-guide/localstack-enterprise/enterprise-image/ /aws/enterprise/enterprise-image 301 -/user-guide/tools/testing-utils/ /aws/configuration/testing-utils 301 -/user-guide/aws/codedeploy/ /aws/services/codedeploy 301 -/references/coverage/coverage_serverlessrepo/ /aws/services/serverlessrepo 301 -/user-guide/aws/resource_groups/ /aws/services/resource_groups 301 -/references/coverage/coverage_glue/ /aws/services/glue 301 -/user-guide/aws/ssm/ /aws/services/ssm 301 -/references/coverage/coverage_sts/ /aws/services/sts 301 +/user-guide/state-management/export-import-state/ /aws/developer-tools/snapshots/export-import-state/ 301 +/references/coverage/coverage_s3control/ /aws/services/s3/ 301 +/references/custom-tls-certificates/ /aws/developer-tools/security-testing/custom-tls-certificates/ 301 +/references/coverage/coverage_codecommit/ /aws/services/codecommit/ 301 +/user-guide/localstack-enterprise/enterprise-image/ /aws/customization/other-installations/enterprise-image/ 301 +/user-guide/tools/testing-utils/ /aws/customization/integrations/localstack-sdks/testing-utils/ 301 +/user-guide/aws/codedeploy/ /aws/services/codedeploy/ 301 +/references/coverage/coverage_serverlessrepo/ /aws/services/serverlessrepo/ 301 +/user-guide/aws/resource_groups/ /aws/services/resource_groups/ 301 +/references/coverage/coverage_glue/ /aws/services/glue/ 301 +/user-guide/aws/ssm/ /aws/services/ssm/ 301 +/references/coverage/coverage_sts/ /aws/services/sts/ 301 /academy/localstack-101/course-overview/ https://www.youtube.com/watch?list=PLTew28KOwGxPqbkFiW518eeIfiV495bm0&v=VLL-BI1AWcc&feature=youtu.be 301 -/user-guide/aws/iotwireless/ /aws/services/iotwireless 301 -/user-guide/integrations/sdks/python/ /aws/connecting/aws-sdks/net/python 301 -/user-guide/integrations/crossplane/ /aws/connecting/infrastructure-as-code/crossplane 301 -/references/coverage/coverage_elbv2/ /aws/services/elb 301 -/user-guide/integrations/openshift/ /aws/integrations/containers/openshift 301 -/user-guide/aws/memorydb/ /aws/services/memorydb 301 -/user-guide/integrations/devcontainers/ /aws/integrations/containers/devcontainers 301 -/references/coverage/coverage_secretsmanager/ /aws/services/secretsmanager 301 -/user-guide/ci/travis-ci/ /aws/integrations/continuous-integration/travis-ci 301 +/user-guide/aws/iotwireless/ /aws/services/iotwireless/ 301 +/user-guide/integrations/sdks/python/ /aws/connecting/aws-sdks/net/python/ 301 +/user-guide/integrations/crossplane/ /aws/connecting/infrastructure-as-code/crossplane/ 301 +/references/coverage/coverage_elbv2/ /aws/services/elb/ 301 +/user-guide/integrations/openshift/ /aws/customization/kubernetes/openshift/ 301 +/user-guide/aws/memorydb/ /aws/services/memorydb/ 301 +/user-guide/integrations/devcontainers/ /aws/customization/other-installations/devcontainers/ 301 +/references/coverage/coverage_secretsmanager/ /aws/services/secretsmanager/ 301 +/user-guide/ci/travis-ci/ /aws/ci-pipelines/travis-ci/ 301 /applications/serverless-microservices-with-amazon-api-gateway-dynamodb-sqs-and-lambda/ https://github.com/localstack-samples/sample-microservices-apigateway-lambda-dynamodb-sqs 301 -/user-guide/lambda-tools/ /aws/developer-tools/lambda-tools 301 -/user-guide/integrations/aws-cdk/ /aws/connecting/infrastructure-as-code/aws-cdk 301 -/references/podman/ /aws/configuration/config/podman 301 -/references/coverage/coverage_memorydb/ /aws/services/memorydb 301 -/user-guide/integrations/former2/ /aws/connecting/infrastructure-as-code/former2 301 -/user-guide/localstack-enterprise/k8s-operator/ /aws/enterprise/k8s-operator 301 -/user-guide/integrations/aws-cli/ /aws/connecting/aws-cli 301 -/references/coverage/coverage_kinesisanalyticsv2/ /aws/services/kinesisanalyticsv2 301 -/references/coverage/coverage_amplify/ /aws/services/amplify 301 -/user-guide/aws/events/ /aws/services/events 301 -/user-guide/aws/pipes/ /aws/services/pipes 301 -/user-guide/ci/circle-ci/ /aws/integrations/continuous-integration/circle-ci 301 -/references/network-troubleshooting/transparent-endpoint-injection/ /aws/configuration/networking/transparent-endpoint-injection 301 -/references/coverage/coverage_kafka/ /aws/services/kafka 301 -/references/coverage/coverage_servicediscovery/ /aws/services/servicediscovery 301 -/references/coverage/coverage_apigateway/ /aws/services/apigateway 301 -/tutorials/ /aws/tutorials 301 -/references/coverage/coverage_kinesis/ /aws/services/kinesis 301 -/references/coverage/coverage_autoscaling/ /aws/services/autoscaling 301 -/references/coverage/coverage_kms/ /aws/services/kms 301 +/user-guide/lambda-tools/ /aws/developer-tools/lambda-tools/ 301 +/user-guide/integrations/aws-cdk/ /aws/connecting/infrastructure-as-code/aws-cdk/ 301 +/references/podman/ /aws/customization/other-installations/podman/ 301 +/references/coverage/coverage_memorydb/ /aws/services/memorydb/ 301 +/user-guide/integrations/former2/ /aws/connecting/infrastructure-as-code/former2/ 301 +/user-guide/localstack-enterprise/k8s-operator/ /aws/customization/kubernetes/kubernetes-operator/ 301 +/user-guide/integrations/aws-cli/ /aws/connecting/aws-cli/ 301 +/references/coverage/coverage_kinesisanalyticsv2/ /aws/services/kinesisanalyticsv2/ 301 +/references/coverage/coverage_amplify/ /aws/services/amplify/ 301 +/user-guide/aws/events/ /aws/services/events/ 301 +/user-guide/aws/pipes/ /aws/services/pipes/ 301 +/user-guide/ci/circle-ci/ /aws/ci-pipelines/circleci/ 301 +/references/network-troubleshooting/transparent-endpoint-injection/ /aws/customization/networking/transparent-endpoint-injection/ 301 +/references/coverage/coverage_kafka/ /aws/services/kafka/ 301 +/references/coverage/coverage_servicediscovery/ /aws/services/servicediscovery/ 301 +/references/coverage/coverage_apigateway/ /aws/services/apigateway/ 301 +/tutorials/ /aws/tutorials/ 301 +/references/coverage/coverage_kinesis/ /aws/services/kinesis/ 301 +/references/coverage/coverage_autoscaling/ /aws/services/autoscaling/ 301 +/references/coverage/coverage_kms/ /aws/services/kms/ 301 /applications/step-up-authentication-using-amazon-cognito/ https://github.com/localstack-samples/sample-cdk-cognito-dynamodb-api-gateway 301 -/references/coverage/coverage_athena/ /aws/services/athena 301 -/user-guide/aws/mediastore/ /aws/services/mediastore 301 -/references/coverage/coverage_fis/ /aws/services/fis 301 -/user-guide/aws/logs/ /aws/services/logs 301 +/references/coverage/coverage_athena/ /aws/services/athena/ 301 +/user-guide/aws/mediastore/ /aws/services/mediastore/ 301 +/references/coverage/coverage_fis/ /aws/services/fis/ 301 +/user-guide/aws/logs/ /aws/services/logs/ 301 /academy/localstack-deployment/infra-cloudformation/ https://www.youtube.com/watch?list=PLTew28KOwGxPdtdW00WNXZLZnstvRQyTF&v=K0OgQ5eq588&feature=youtu.be 301 -/user-guide/cloud-sandbox/ /aws/developer-tools/cloud-sandbox 301 -/user-guide/localstack-enterprise/ci-analytics/ /aws/enterprise/ 301 -/aws/enterprise/ci-analytics/ /aws/enterprise/ 301 -/references/changelog/ /aws/changelog 301 -/references/credentials/ /aws/configuration/config/credentials 301 -/references/coverage/coverage_elasticbeanstalk/ /aws/services/elasticbeanstalk 301 -/user-guide/web-application/instance-management/ /aws/configuration/web-app/instance-management 301 -/references/coverage/coverage_qldb/ /aws/services/qldb 301 +/user-guide/cloud-sandbox/ /aws/developer-tools/cloud-sandbox/ 301 +/user-guide/localstack-enterprise/ci-analytics/ /aws/customization/other-installations/ 301 +/aws/enterprise/ci-analytics/ /aws/customization/other-installations/ 301 +/references/changelog/ /aws/changelog/ 301 +/references/credentials/ /aws/connecting/credentials/ 301 +/references/coverage/coverage_elasticbeanstalk/ /aws/services/elasticbeanstalk/ 301 +/user-guide/web-application/instance-management/ /aws/connecting/console/instance-management/ 301 +/references/coverage/coverage_qldb/ /aws/services/qldb/ 301 /academy/localstack-deployment/iam-policy-stream/ https://www.youtube.com/watch?list=PLTew28KOwGxPdtdW00WNXZLZnstvRQyTF&v=TOBLG2Z6xAM&feature=youtu.be 301 -/references/cross-account-access/ /aws/configuration/config/cross-account-access 301 -/tutorials/reproducible-machine-learning-cloud-pods/ /aws/tutorials/reproducible-machine-learning-cloud-pods 301 -/references/coverage/coverage_ecs/ /aws/services/ecs 301 -/references/coverage/coverage_acm/ /aws/services/acm 301 -/references/coverage/coverage_cloudtrail/ /aws/services/cloudtrail 301 +/references/cross-account-access/ /aws/customization/advanced/cross-account-access/ 301 +/tutorials/reproducible-machine-learning-cloud-pods/ /aws/tutorials/reproducible-machine-learning-cloud-pods/ 301 +/references/coverage/coverage_ecs/ /aws/services/ecs/ 301 +/references/coverage/coverage_acm/ /aws/services/acm/ 301 +/references/coverage/coverage_cloudtrail/ /aws/services/cloudtrail/ 301 /user-guide/aws/ /aws/services/ 301 -/references/lambda-provider-v2/ /aws/services/lambda 301 -/user-guide/web-application/ci-keys/ /aws/configuration/web-app/ci-keys 301 +/references/lambda-provider-v2/ /aws/services/lambda/ 301 +/user-guide/web-application/ci-keys/ /aws/organizations-admin/ 301 /academy/localstack-deployment/ls-integrations/ https://www.youtube.com/watch?v=YV0Zs6UNI9I&feature=youtu.be 301 -/references/coverage/coverage_appconfigdata/ /aws/services/appconfig 301 +/references/coverage/coverage_appconfigdata/ /aws/services/appconfig/ 301 /applications/serverless-image-resizer-with-aws-lambda-s3-sns-and-ses/ https://github.com/localstack-samples/sample-serverless-image-resizer-s3-lambda 301 /user-guide/security-testing/ /aws/developer-tools/security-testing/ 301 -/user-guide/aws/applicationautoscaling/ /aws/services/application-autoscaling 301 -/user-guide/aws/bedrock/ /aws/services/bedrock 301 -/user-guide/aws/sts/ /aws/services/sts 301 -/user-guide/aws/docdb/ /aws/services/docdb 301 -/user-guide/tools/transparent-endpoint-injection/ /aws/configuration/networking/transparent-endpoint-injection 301 -/user-guide/aws/account/ /aws/services/account 301 -/references/coverage/coverage_efs/ /aws/services/efs 301 -/user-guide/localstack-enterprise/ /aws/enterprise/ 301 -/getting-started/auth-token/ /aws/getting-started/auth-token 301 -/user-guide/localstack-enterprise/enterprise-support/ /aws/enterprise/enterprise-support 301 -/user-guide/aws/support/ /aws/services/support 301 -/references/coverage/coverage_resourcegroupstaggingapi/ /aws/services/resource-groups 301 -/references/external-ports/ /aws/configuration/networking/external-port-range 301 -/references/coverage/coverage_ce/ /aws/services/ce 301 -/user-guide/extensions/getting-started/ /aws/configuration/extensions/getting-started 301 +/user-guide/aws/applicationautoscaling/ /aws/services/application-autoscaling/ 301 +/user-guide/aws/bedrock/ /aws/services/bedrock/ 301 +/user-guide/aws/sts/ /aws/services/sts/ 301 +/user-guide/aws/docdb/ /aws/services/docdb/ 301 +/user-guide/tools/transparent-endpoint-injection/ /aws/customization/networking/transparent-endpoint-injection/ 301 +/user-guide/aws/account/ /aws/services/account/ 301 +/references/coverage/coverage_efs/ /aws/services/efs/ 301 +/user-guide/localstack-enterprise/ /aws/customization/other-installations/ 301 +/getting-started/auth-token/ /aws/getting-started/auth-token/ 301 +/user-guide/localstack-enterprise/enterprise-support/ /aws/customization/other-installations/ 301 +/user-guide/aws/support/ /aws/services/support/ 301 +/references/coverage/coverage_resourcegroupstaggingapi/ /aws/services/resource-groups/ 301 +/references/external-ports/ /aws/customization/networking/external-port-range/ 301 +/references/coverage/coverage_ce/ /aws/services/ce/ 301 +/user-guide/extensions/getting-started/ /aws/customization/integrations/extensions/ 301 /references/coverage/coverage_codeartifact/ /aws/services/codeartifact/ 301 /user-guide/integrations/sdks/ /aws/connecting/aws-sdks/ 301 -/user-guide/localstack-enterprise/single-sign-on/azure-ad/ /aws/enterprise/sso/azure-ad 301 -/user-guide/tools/localstack-desktop/ /aws/configuration/web-app/localstack-desktop 301 -/references/coverage/coverage_es/ /aws/services/es 301 -/user-guide/integrations/sdks/javascript/ /aws/connecting/aws-sdks/net/javascript 301 -/references/coverage/coverage_iam/ /aws/services/iam 301 -/user-guide/tools/localsurf/ /aws/configuration/localsurf 301 -/user-guide/extensions/extensions-library/ /aws/configuration/extensions/extensions-library 301 -/tutorials/ecs-ecr-container-app/ /aws/tutorials/ecs-ecr-container-app 301 -/references/coverage/coverage_elastictranscoder/ /aws/services/elastictranscoder 301 +/user-guide/localstack-enterprise/single-sign-on/azure-ad/ /aws/organizations-admin/sso/azure-ad/ 301 +/user-guide/tools/localstack-desktop/ /aws/developer-tools/running-localstack/localstack-desktop/ 301 +/references/coverage/coverage_es/ /aws/services/es/ 301 +/user-guide/integrations/sdks/javascript/ /aws/connecting/aws-sdks/net/javascript/ 301 +/references/coverage/coverage_iam/ /aws/services/iam/ 301 +/user-guide/tools/localsurf/ /aws/customization/networking/localsurf/ 301 +/user-guide/extensions/extensions-library/ /aws/customization/integrations/extensions/extensions-library/ 301 +/tutorials/ecs-ecr-container-app/ /aws/tutorials/ecs-ecr-container-app/ 301 +/references/coverage/coverage_elastictranscoder/ /aws/services/elastictranscoder/ 301 /user-guide/aws/feature-coverage/ /aws/services/ 301 -/user-guide/aws/lambda/ /aws/services/lambda 301 +/user-guide/aws/lambda/ /aws/services/lambda/ 301 /references/iam-coverage/ /aws/developer-tools/security-testing/iam-coverage/ 301 -/user-guide/aws/transfer/ /aws/services/transfer 301 -/references/coverage/coverage_batch/ /aws/services/batch 301 -/references/coverage/coverage_neptune/ /aws/services/neptune 301 +/user-guide/aws/transfer/ /aws/services/transfer/ 301 +/references/coverage/coverage_batch/ /aws/services/batch/ 301 +/references/coverage/coverage_neptune/ /aws/services/neptune/ 301 /applications/temp/ /aws/sample-apps/ 301 /applications/serverless-container-based-apis-with-amazon-ecs-api-gateway/ https://github.com/localstack-samples/sample-terraform-ecs-apigateway 301 -/user-guide/aws/s3/ /aws/services/s3 301 -/user-guide/lambda-tools/vscode-extension/ /aws/connecting/ides/vscode-extension 301 +/user-guide/aws/s3/ /aws/services/s3/ 301 +/user-guide/lambda-tools/vscode-extension/ /aws/connecting/ides/vscode-extension/ 301 /user-guide/chaos-engineering/ /aws/developer-tools/chaos-engineering/ 301 -/persistence/supported/ /aws/developer-tools/snapshots/persistence 301 -/user-guide/aws/ce/ /aws/services/ce 301 -/user-guide/aws/kinesisanalyticsv2/ /aws/services/kinesisanalyticsv2 301 -/user-guide/state-management/cloud-pods/ /aws/developer-tools/snapshots/cloud-pods 301 -/references/coverage/coverage_transcribe/ /aws/services/transcribe 301 -/references/coverage/coverage_mediastore-data/ /aws/services/mediastore 301 -/user-guide/aws/route53/ /aws/services/route53 301 -/user-guide/aws/config/ /aws/services/config 301 -/references/coverage/coverage_identitystore/ /aws/services/identitystore 301 -/references/coverage/coverage_codedeploy/ /aws/services/codedeploy 301 -/user-guide/aws/msk/ /aws/services/kafka 301 +/persistence/supported/ /aws/developer-tools/snapshots/persistence/ 301 +/user-guide/aws/ce/ /aws/services/ce/ 301 +/user-guide/aws/kinesisanalyticsv2/ /aws/services/kinesisanalyticsv2/ 301 +/user-guide/state-management/cloud-pods/ /aws/developer-tools/snapshots/cloud-pods/ 301 +/references/coverage/coverage_transcribe/ /aws/services/transcribe/ 301 +/references/coverage/coverage_mediastore-data/ /aws/services/mediastore/ 301 +/user-guide/aws/route53/ /aws/services/route53/ 301 +/user-guide/aws/config/ /aws/services/config/ 301 +/references/coverage/coverage_identitystore/ /aws/services/identitystore/ 301 +/references/coverage/coverage_codedeploy/ /aws/services/codedeploy/ 301 +/user-guide/aws/msk/ /aws/services/kafka/ 301 /user-guide/state-management/ /aws/developer-tools/snapshots/ 301 /user-guide/integrations/copilot/ /aws/connecting/infrastructure-as-code/ 301 -/user-guide/integrations/eksctl/ /aws/integrations/containers/eksctl/ 301 -/getting-started/faq/ /aws/getting-started/faq 301 -/user-guide/aws/elb/ /aws/services/elb 301 -/user-guide/integrations/kubernetes/ /aws/integrations/containers/kubernetes/ 301 -/user-guide/aws/lakeformation/ /aws/services/lakeformation 301 -/developer-hub/ /aws/sample-apps 301 -/references/coverage/coverage_firehose/ /aws/services/firehose 301 -/user-guide/aws/verifiedpermissions/ /aws/services/verifiedpermissions 301 -/references/coverage/coverage_kinesisanalytics/ /aws/services/kinesisanalytics 301 -/user-guide/aws/sns/ /aws/services/sns 301 -/user-guide/tools/aws-replicator/ /aws/developer-tools/aws-replicator 301 -/user-guide/integrations/serverless-framework/ /aws/connecting/infrastructure-as-code/serverless-framework 301 -/references/coverage/coverage_sqs/ /aws/services/sqs 301 -/user-guide/aws/appsync/ /aws/services/appsync 301 -/tutorials/schema-evolution-glue-msk/ /aws/tutorials/schema-evolution-glue-msk 301 -/user-guide/ci/bitbucket/ /aws/integrations/continuous-integration/bitbucket 301 +/user-guide/integrations/eksctl/ /aws/customization/kubernetes/eksctl/ 301 +/getting-started/faq/ /aws/getting-started/faq/ 301 +/user-guide/aws/elb/ /aws/services/elb/ 301 +/user-guide/integrations/kubernetes/ /aws/customization/kubernetes/ 301 +/user-guide/aws/lakeformation/ /aws/services/lakeformation/ 301 +/developer-hub/ /aws/sample-apps/ 301 +/references/coverage/coverage_firehose/ /aws/services/firehose/ 301 +/user-guide/aws/verifiedpermissions/ /aws/services/verifiedpermissions/ 301 +/references/coverage/coverage_kinesisanalytics/ /aws/services/kinesisanalytics/ 301 +/user-guide/aws/sns/ /aws/services/sns/ 301 +/user-guide/tools/aws-replicator/ /aws/developer-tools/aws-replicator/ 301 +/user-guide/integrations/serverless-framework/ /aws/connecting/infrastructure-as-code/serverless-framework/ 301 +/references/coverage/coverage_sqs/ /aws/services/sqs/ 301 +/user-guide/aws/appsync/ /aws/services/appsync/ 301 +/tutorials/schema-evolution-glue-msk/ /aws/tutorials/schema-evolution-glue-msk/ 301 +/user-guide/ci/bitbucket/ /aws/ci-pipelines/bitbucket/ 301 /contributing/ https://github.com/localstack/localstack/blob/main/docs/CONTRIBUTING.md 301 -/user-guide/aws/scheduler/ /aws/services/scheduler 301 -/user-guide/integrations/quarkus/ /aws/integrations/app-frameworks/quarkus 301 -/user-guide/aws/servicediscovery/ /aws/services/servicediscovery 301 +/user-guide/aws/scheduler/ /aws/services/scheduler/ 301 +/user-guide/integrations/quarkus/ /aws/integrations/app-frameworks/quarkus/ 301 +/user-guide/aws/servicediscovery/ /aws/services/servicediscovery/ 301 /academy/localstack-101/ https://www.youtube.com/playlist?list=PLTew28KOwGxPqbkFiW518eeIfiV495bm0&si=rKhzdxOJsfO_pgyk 301 -/user-guide/aws/xray/ /aws/services/xray 301 -/user-guide/aws/pca/ /aws/services/acm-pca 301 -/user-guide/aws/waf/ /aws/services/waf 301 +/user-guide/aws/xray/ /aws/services/xray/ 301 +/user-guide/aws/pca/ /aws/services/acm-pca/ 301 +/user-guide/aws/waf/ /aws/services/waf/ 301 /applications/event-driven-architecture-with-amazon-sns-fifo-dynamodb-lambda-and-s3/ https://github.com/localstack-samples/sample-sam-sns-fifo-dynamodb-lambda 301 -/user-guide/aws/apigateway/ /aws/services/apigateway 301 +/user-guide/aws/apigateway/ /aws/services/apigateway/ 301 /user-guide/integrations/cloud-custodian/ /aws/connecting/infrastructure-as-code/cloud-custodian/ 301 -/references/coverage/coverage_lambda/ /aws/services/lambda 301 -/user-guide/integrations/sdks/java/ /aws/connecting/aws-sdks/net/java 301 -/references/coverage/coverage_logs/ /aws/services/logs 301 -/references/coverage/coverage_mediastore/ /aws/services/mediastore 301 -/user-guide/integrations/kafka/ /aws/integrations/messaging/selfmanaged-kafka-cluster/ 301 -/user-guide/chaos-engineering/fault-injection-service/ /aws/developer-tools/chaos-engineering/fault-injection-service 301 -/references/logging/ /aws/configuration/config/logging 301 -/tutorials/java-notification-app/ /aws/tutorials/java-notification-app 301 +/references/coverage/coverage_lambda/ /aws/services/lambda/ 301 +/user-guide/integrations/sdks/java/ /aws/connecting/aws-sdks/net/java/ 301 +/references/coverage/coverage_logs/ /aws/services/logs/ 301 +/references/coverage/coverage_mediastore/ /aws/services/mediastore/ 301 +/user-guide/integrations/kafka/ /aws/customization/integrations/app-frameworks/selfmanaged-kafka-cluster/ 301 +/user-guide/chaos-engineering/fault-injection-service/ /aws/developer-tools/chaos-engineering/fault-injection-service/ 301 +/references/logging/ /aws/customization/logging/ 301 +/tutorials/java-notification-app/ /aws/tutorials/java-notification-app/ 301 /applications/serverless-transcription-application-using-transcribe-s3-lambda-sqs-and-ses/ https://github.com/localstack-samples/sample-serverless-transcribe 301 -/user-guide/aws/route53resolver/ /aws/services/route53resolver 301 -/references/coverage/coverage_wafv2/ /aws/services/waf 301 -/user-guide/integrations/sdks/cpp/ /aws/connecting/aws-sdks/net/cpp 301 -/user-guide/integrations/testcontainers/ /aws/integrations/testing/testcontainers 301 -/references/internal-endpoints/ /aws/configuration/networking/internal-endpoints 301 -/tutorials/lambda-ecr-container-images/ /aws/tutorials/lambda-ecr-container-images 301 -/user-guide/aws/fis/ /aws/services/fis 301 -/user-guide/tools/localstack-docker-extension/ /aws/configuration/localstack-docker-extension/ 301 -/user-guide/aws/cloudformation/ /aws/services/cloudformation 301 -/tutorials/route-53-failover/ /aws/tutorials/route-53-failover 301 -/user-guide/web-application/resource-browser/ /aws/connecting/console/resource-browser 301 +/user-guide/aws/route53resolver/ /aws/services/route53resolver/ 301 +/references/coverage/coverage_wafv2/ /aws/services/waf/ 301 +/user-guide/integrations/sdks/cpp/ /aws/connecting/aws-sdks/net/cpp/ 301 +/user-guide/integrations/testcontainers/ /aws/integrations/testing/testcontainers/ 301 +/references/internal-endpoints/ /aws/customization/networking/internal-endpoints/ 301 +/tutorials/lambda-ecr-container-images/ /aws/tutorials/lambda-ecr-container-images/ 301 +/user-guide/aws/fis/ /aws/services/fis/ 301 +/user-guide/tools/localstack-docker-extension/ /aws/customization/other-installations/localstack-docker-extension/ 301 +/user-guide/aws/cloudformation/ /aws/services/cloudformation/ 301 +/tutorials/route-53-failover/ /aws/tutorials/route-53-failover/ 301 +/user-guide/web-application/resource-browser/ /aws/connecting/console/resource-browser/ 301 /applications/loan-broker-application-with-aws-step-functions-dynamodb-lambda-sqs-and-sns/ https://github.com/localstack-samples/sample-loan-broker-stepfunctions-lambda 301 -/references/coverage/coverage_resource-groups/ /aws/services/resource-groups 301 -/user-guide/state-management/support/ /aws/developer-tools/snapshots/persistence-coverage 301 -/references/coverage/coverage_redshift/ /aws/services/redshift 301 +/references/coverage/coverage_resource-groups/ /aws/services/resource-groups/ 301 +/user-guide/state-management/support/ /aws/developer-tools/snapshots/persistence-coverage/ 301 +/references/coverage/coverage_redshift/ /aws/services/redshift/ 301 /user-guide/integrations/lambdatest-hyperexecute/ /aws/integrations/testing/lambdatest-hyperexecute/ 301 /applications/ /aws/sample-apps/ 301 -/user-guide/web-application/users-and-licenses/ /aws/configuration/web-app/users-and-licenses 301 -/user-guide/tools/localstack-sdk/ /aws/configuration/localstack-sdks/ 301 -/references/coverage/coverage_apigatewaymanagementapi/ /aws/services/apigateway 301 -/references/coverage/coverage_transfer/ /aws/services/transfer 301 +/user-guide/web-application/users-and-licenses/ /aws/organizations-admin/managing-users-licenses/ 301 +/user-guide/tools/localstack-sdk/ /aws/customization/integrations/localstack-sdks/ 301 +/references/coverage/coverage_apigatewaymanagementapi/ /aws/services/apigateway/ 301 +/references/coverage/coverage_transfer/ /aws/services/transfer/ 301 /references/coverage/coverage_codeconnections/ /aws/services/codeconnections/ 301 -/user-guide/aws/athena/ /aws/services/athena 301 -/user-guide/extensions/official-extensions/ /aws/configuration/extensions/official-extensions 301 -/user-guide/aws/textract/ /aws/services/textract 301 -/tutorials/iam-policy-stream/ /aws/tutorials/iam-policy-stream 301 -/references/coverage/coverage_ses/ /aws/services/ses 301 -/tutorials/gitlab_ci_testcontainers/ /aws/tutorials/gitlab-ci-testcontainers 301 -/user-guide/integrations/aws-sam/ /aws/connecting/infrastructure-as-code/aws-sam 301 -/user-guide/aws/firehose/ /aws/services/firehose 301 -/user-guide/web-application/ /aws/configuration/web-app/ 301 -/references/coverage/coverage_sagemaker/ /aws/services/sagemaker 301 -/references/arm64-support/ /aws/configuration/config/arm64-support/ 301 -/user-guide/aws/shield/ /aws/services/shield 301 -/user-guide/integrations/terraform/ /aws/connecting/infrastructure-as-code/terraform 301 -/user-guide/aws/es/ /aws/services/es 301 -/references/coverage/coverage_dms/ /aws/services/dms 301 -/user-guide/extensions/developing-extensions/ /aws/configuration/extensions/developing-extensions 301 -/user-guide/security-testing/explainable-iam/ /aws/developer-tools/security-testing/explainable-iam 301 -/user-guide/aws/ram/ /aws/services/ram 301 -/references/coverage/coverage_ssm/ /aws/services/ssm 301 -/references/network-troubleshooting/created-resources/ /aws/configuration/networking/created-resources 301 -/user-guide/aws/swf/ /aws/services/swf 301 -/user-guide/ci/github-actions/ /aws/integrations/continuous-integration/github-actions 301 -/user-guide/aws/serverlessrepo/ /aws/services/serverlessrepo 301 -/user-guide/aws/sqs/ /aws/services/sqs 301 -/references/coverage/coverage_ram/ /aws/services/ram 301 -/user-guide/aws/secretsmanager/ /aws/services/secretsmanager 301 -/user-guide/web-application/stack-insights/ /aws/configuration/web-app/stack-insights 301 -/user-guide/aws/autoscaling/ /aws/services/autoscaling 301 -/references/coverage/coverage_opensearch/ /aws/services/opensearch 301 +/user-guide/aws/athena/ /aws/services/athena/ 301 +/user-guide/extensions/official-extensions/ /aws/customization/integrations/extensions/extensions-library/ 301 +/user-guide/aws/textract/ /aws/services/textract/ 301 +/tutorials/iam-policy-stream/ /aws/tutorials/iam-policy-stream/ 301 +/references/coverage/coverage_ses/ /aws/services/ses/ 301 +/tutorials/gitlab_ci_testcontainers/ /aws/tutorials/gitlab-ci-testcontainers/ 301 +/user-guide/integrations/aws-sam/ /aws/connecting/infrastructure-as-code/aws-sam/ 301 +/user-guide/aws/firehose/ /aws/services/firehose/ 301 +/user-guide/web-application/ /aws/organizations-admin/ 301 +/references/coverage/coverage_sagemaker/ /aws/services/sagemaker/ 301 +/references/arm64-support/ /aws/customization/advanced/arm64-support/ 301 +/user-guide/aws/shield/ /aws/services/shield/ 301 +/user-guide/integrations/terraform/ /aws/connecting/infrastructure-as-code/terraform/ 301 +/user-guide/aws/es/ /aws/services/es/ 301 +/references/coverage/coverage_dms/ /aws/services/dms/ 301 +/user-guide/extensions/developing-extensions/ /aws/customization/integrations/extensions/developing-extensions/ 301 +/user-guide/security-testing/explainable-iam/ /aws/developer-tools/security-testing/explainable-iam/ 301 +/user-guide/aws/ram/ /aws/services/ram/ 301 +/references/coverage/coverage_ssm/ /aws/services/ssm/ 301 +/references/network-troubleshooting/created-resources/ /aws/customization/networking/accessing-resources-created/ 301 +/user-guide/aws/swf/ /aws/services/swf/ 301 +/user-guide/ci/github-actions/ /aws/ci-pipelines/github-actions/ 301 +/user-guide/aws/serverlessrepo/ /aws/services/serverlessrepo/ 301 +/user-guide/aws/sqs/ /aws/services/sqs/ 301 +/references/coverage/coverage_ram/ /aws/services/ram/ 301 +/user-guide/aws/secretsmanager/ /aws/services/secretsmanager/ 301 +/user-guide/web-application/stack-insights/ /aws/organizations-admin/stack-insights/ 301 +/user-guide/aws/autoscaling/ /aws/services/autoscaling/ 301 +/references/coverage/coverage_opensearch/ /aws/services/opensearch/ 301 /academy/localstack-101/cloud-pods/ https://www.youtube.com/watch?list=PLTew28KOwGxPqbkFiW518eeIfiV495bm0&v=InqTdSvxuag&feature=youtu.be 301 -/references/coverage/coverage_emr-serverless/ /aws/services/emr 301 -/user-guide/aws/cloudwatch/ /aws/services/cloudwatch 301 -/user-guide/aws/elasticbeanstalk/ /aws/services/elasticbeanstalk 301 -/references/coverage/coverage_mediaconvert/ /aws/services/mediaconvert 301 -/user-guide/state-management/launchpad/ /aws/developer-tools/snapshots/launchpad 301 -/user-guide/ci/codebuild/ /aws/integrations/continuous-integration/codebuild 301 -/user-guide/aws/iot-data/ /aws/services/iot-data 301 -/references/coverage/coverage_textract/ /aws/services/textract 301 -/references/coverage/coverage_codebuild/ /aws/services/codebuild 301 -/user-guide/aws/elastictranscoder/ /aws/services/elastictranscoder 301 -/references/coverage/coverage_glacier/ /aws/services/glacier 301 +/references/coverage/coverage_emr-serverless/ /aws/services/emr/ 301 +/user-guide/aws/cloudwatch/ /aws/services/cloudwatch/ 301 +/user-guide/aws/elasticbeanstalk/ /aws/services/elasticbeanstalk/ 301 +/references/coverage/coverage_mediaconvert/ /aws/services/mediaconvert/ 301 +/user-guide/state-management/launchpad/ /aws/developer-tools/snapshots/launchpad/ 301 +/user-guide/ci/codebuild/ /aws/ci-pipelines/codebuild/ 301 +/user-guide/aws/iot-data/ /aws/services/iot-data/ 301 +/references/coverage/coverage_textract/ /aws/services/textract/ 301 +/references/coverage/coverage_codebuild/ /aws/services/codebuild/ 301 +/user-guide/aws/elastictranscoder/ /aws/services/elastictranscoder/ 301 +/references/coverage/coverage_glacier/ /aws/services/glacier/ 301 /user-guide/tools/ /aws/developer-tools/ 301 -/user-guide/aws/timestream/ /aws/services/timestream-query 301 -/references/coverage/coverage_pinpoint/ /aws/services/pinpoint 301 +/user-guide/aws/timestream/ /aws/services/timestream-query/ 301 +/references/coverage/coverage_pinpoint/ /aws/services/pinpoint/ 301 /applications/serverless-rds-proxy-with-api-gateway-lambda-and-aurora-rds/ https://github.com/localstack-samples/sample-serverless-rds-proxy-demo 301 /academy/localstack-101/why-localstack/ https://www.youtube.com/watch?list=PLTew28KOwGxPqbkFiW518eeIfiV495bm0&v=EDGIBpUpYWU&feature=youtu.be 301 -/user-guide/aws/transcribe/ /aws/services/transcribe 301 -/references/coverage/coverage_cloudformation/ /aws/services/cloudformation 301 -/references/coverage/coverage_apigatewayv2/ /aws/services/apigateway 301 -/user-guide/aws/kinesis/ /aws/services/kinesis 301 -/references/coverage/coverage_bedrock-runtime/ /aws/services/bedrock 301 -/references/coverage/coverage_iot-data/ /aws/services/iot-data 301 -/user-guide/cloud-sandbox/ephemeral-instance/ /aws/developer-tools/cloud-sandbox/ephemeral-instance 301 -/references/coverage/coverage_timestream-write/ /aws/services/timestream-query 301 -/user-guide/aws/pinpoint/ /aws/services/pinpoint 301 -/tutorials/cloud-pods-collaborative-debugging/ /aws/tutorials/cloud-pods-collaborative-debugging 301 -/references/coverage/coverage_emr/ /aws/services/emr 301 -/user-guide/aws/iam/ /aws/services/iam 301 +/user-guide/aws/transcribe/ /aws/services/transcribe/ 301 +/references/coverage/coverage_cloudformation/ /aws/services/cloudformation/ 301 +/references/coverage/coverage_apigatewayv2/ /aws/services/apigateway/ 301 +/user-guide/aws/kinesis/ /aws/services/kinesis/ 301 +/references/coverage/coverage_bedrock-runtime/ /aws/services/bedrock/ 301 +/references/coverage/coverage_iot-data/ /aws/services/iot-data/ 301 +/user-guide/cloud-sandbox/ephemeral-instance/ /aws/developer-tools/cloud-sandbox/ephemeral-instance/ 301 +/references/coverage/coverage_timestream-write/ /aws/services/timestream-query/ 301 +/user-guide/aws/pinpoint/ /aws/services/pinpoint/ 301 +/tutorials/cloud-pods-collaborative-debugging/ /aws/tutorials/cloud-pods-collaborative-debugging/ 301 +/references/coverage/coverage_emr/ /aws/services/emr/ 301 +/user-guide/aws/iam/ /aws/services/iam/ 301 /academy/localstack-deployment/course-overview/ https://www.youtube.com/watch?list=PLTew28KOwGxPdtdW00WNXZLZnstvRQyTF&v=XDIat6laW28&feature=youtu.be 301 -/references/coverage/coverage_codepipeline/ /aws/services/codepipeline 301 +/references/coverage/coverage_codepipeline/ /aws/services/codepipeline/ 301 /academy/localstack-deployment/infra-terraform/ https://www.youtube.com/watch?list=PLTew28KOwGxPdtdW00WNXZLZnstvRQyTF&v=lsF3kewOeBU&feature=youtu.be 301 -/references/network-troubleshooting/ /aws/configuration/networking/ 301 -/user-guide/ci/gitlab-ci/ /aws/integrations/continuous-integration/gitlab-ci 301 -/user-guide/aws/kms/ /aws/services/kms 301 -/references/coverage/coverage_stepfunctions/ /aws/services/stepfunctions 301 -/references/coverage/coverage_sesv2/ /aws/services/ses 301 -/references/coverage/coverage_events/ /aws/services/events 301 -/references/coverage/coverage_timestream-query/ /aws/services/timestream-query 301 -/references/network-troubleshooting/endpoint-url/ /aws/configuration/networking/endpoint-url 301 -/tutorials/ephemeral-application-previews/ /aws/tutorials/ephemeral-application-previews 301 -/user-guide/web-application/accounts/ /aws/configuration/web-app/accounts 301 -/references/coverage/coverage_appsync/ /aws/services/appsync 301 -/references/coverage/coverage_ecr/ /aws/services/ecr 301 +/references/network-troubleshooting/ /aws/customization/networking/ 301 +/user-guide/ci/gitlab-ci/ /aws/ci-pipelines/gitlab-ci/ 301 +/user-guide/aws/kms/ /aws/services/kms/ 301 +/references/coverage/coverage_stepfunctions/ /aws/services/stepfunctions/ 301 +/references/coverage/coverage_sesv2/ /aws/services/ses/ 301 +/references/coverage/coverage_events/ /aws/services/events/ 301 +/references/coverage/coverage_timestream-query/ /aws/services/timestream-query/ 301 +/references/network-troubleshooting/endpoint-url/ /aws/customization/networking/accessing-endpoint-url/ 301 +/tutorials/ephemeral-application-previews/ /aws/tutorials/ephemeral-application-previews/ 301 +/user-guide/web-application/accounts/ /aws/organizations-admin/accounts/ 301 +/references/coverage/coverage_appsync/ /aws/services/appsync/ 301 +/references/coverage/coverage_ecr/ /aws/services/ecr/ 301 /academy/localstack-deployment/ https://www.youtube.com/playlist?list=PLTew28KOwGxPdtdW00WNXZLZnstvRQyTF&si=R-Ed-JQKOxXP473O 301 -/references/coverage/coverage_application-autoscaling/ /aws/services/application-autoscaling 301 -/user-guide/lambda-tools/debugging/ /aws/developer-tools/lambda-tools/debugging 301 +/references/coverage/coverage_application-autoscaling/ /aws/services/application-autoscaling/ 301 +/user-guide/lambda-tools/debugging/ /aws/developer-tools/lambda-tools/debugging/ 301 /references/coverage/coverage_codestar-connections/ /aws/services/codeconnections/ 301 -/user-guide/integrations/rancher-desktop/ /aws/integrations/containers/rancher-desktop 301 -/user-guide/integrations/sdks/ruby/ /aws/connecting/aws-sdks/net/ruby 301 -/user-guide/aws/mwaa/ /aws/services/mwaa 301 +/user-guide/integrations/rancher-desktop/ /aws/customization/other-installations/rancher-desktop/ 301 +/user-guide/integrations/sdks/ruby/ /aws/connecting/aws-sdks/net/ruby/ 301 +/user-guide/aws/mwaa/ /aws/services/mwaa/ 301 /academy/localstack-deployment/deploy-app-ls/ https://www.youtube.com/watch?list=PLTew28KOwGxPdtdW00WNXZLZnstvRQyTF&v=qIB79b-iw2U&feature=youtu.be 301 -/user-guide/aws/organizations/ /aws/services/organizations 301 +/user-guide/aws/organizations/ /aws/services/organizations/ 301 /academy/localstack-deployment/github-action-ls/ https://www.youtube.com/watch?list=PLTew28KOwGxPdtdW00WNXZLZnstvRQyTF&v=XNh8aSaT9v0&feature=youtu.be 301 -/user-guide/aws/sagemaker/ /aws/services/sagemaker 301 -/references/configuration/ /aws/configuration/config/configuration 301 -/user-guide/chaos-engineering/chaos-api/ /aws/developer-tools/chaos-engineering/chaos-api 301 -/user-guide/aws/glacier/ /aws/services/glacier 301 -/references/coverage/coverage_qldb-session/ /aws/services/qldb 301 -/user-guide/integrations/pulumi/ /aws/connecting/infrastructure-as-code/pulumi 301 -/user-guide/aws/cloudtrail/ /aws/services/cloudtrail 301 -/references/coverage/coverage_s3/ /aws/services/s3 301 -/user-guide/aws/emr/ /aws/services/emr 301 -/user-guide/tools/dns-server/ /aws/configuration/dns-server 301 -/user-guide/chaos-engineering/chaos-application-dashboard/ /aws/developer-tools/chaos-engineering/chaos-application-dashboard 301 -/references/coverage/coverage_route53/ /aws/services/route53 301 -/references/coverage/coverage_dynamodbstreams/ /aws/services/dynamodbstreams 301 -/references/coverage/coverage_dynamodb/ /aws/services/dynamodb 301 -/user-guide/aws/ec2/ /aws/services/ec2 301 +/user-guide/aws/sagemaker/ /aws/services/sagemaker/ 301 +/references/configuration/ /aws/customization/configuration-options/ 301 +/user-guide/chaos-engineering/chaos-api/ /aws/developer-tools/chaos-engineering/chaos-api/ 301 +/user-guide/aws/glacier/ /aws/services/glacier/ 301 +/references/coverage/coverage_qldb-session/ /aws/services/qldb/ 301 +/user-guide/integrations/pulumi/ /aws/connecting/infrastructure-as-code/pulumi/ 301 +/user-guide/aws/cloudtrail/ /aws/services/cloudtrail/ 301 +/references/coverage/coverage_s3/ /aws/services/s3/ 301 +/user-guide/aws/emr/ /aws/services/emr/ 301 +/user-guide/tools/dns-server/ /aws/customization/networking/dns-server/ 301 +/user-guide/chaos-engineering/chaos-application-dashboard/ /aws/developer-tools/chaos-engineering/chaos-application-dashboard/ 301 +/references/coverage/coverage_route53/ /aws/services/route53/ 301 +/references/coverage/coverage_dynamodbstreams/ /aws/services/dynamodbstreams/ 301 +/references/coverage/coverage_dynamodb/ /aws/services/dynamodb/ 301 +/user-guide/aws/ec2/ /aws/services/ec2/ 301 /user-guide/cloud-sandbox/application-previews/ /aws/developer-tools/cloud-sandbox/app-preview/ 301 -/user-guide/integrations/spring-cloud-function/ /aws/integrations/app-frameworks/spring-cloud-function 301 -/references/multi-account-setups/ /aws/configuration/config/multi-account-setups/ 301 -/user-guide/aws/elementalmediaconvert/ /aws/services/mediaconvert 301 -/references/coverage/coverage_shield/ /aws/services/shield 301 -/user-guide/aws/dynamodb/ /aws/services/dynamodb 301 +/user-guide/integrations/spring-cloud-function/ /aws/integrations/app-frameworks/spring-cloud-function/ 301 +/references/multi-account-setups/ /aws/customization/advanced/multi-account-setups/ 301 +/user-guide/aws/elementalmediaconvert/ /aws/services/mediaconvert/ 301 +/references/coverage/coverage_shield/ /aws/services/shield/ 301 +/user-guide/aws/dynamodb/ /aws/services/dynamodb/ 301 /aws/tooling/event-studio/ /aws/developer-tools/app-inspector/ 301 /references/coverage/ /aws/services/ 301 -/references/coverage/coverage_acm-pca/ /aws/services/acm-pca 301 -/user-guide/aws/opensearch/ /aws/services/opensearch 301 -/user-guide/aws/neptune/ /aws/services/neptune 301 -/user-guide/aws/codepipeline/ /aws/services/codepipeline 301 -/references/coverage/coverage_docdb/ /aws/services/docdb 301 -/references/coverage/coverage_appconfig/ /aws/services/appconfig 301 -/references/coverage/coverage_iot/ /aws/services/iot 301 -/getting-started/installation/ /aws/getting-started/installation 301 +/references/coverage/coverage_acm-pca/ /aws/services/acm-pca/ 301 +/user-guide/aws/opensearch/ /aws/services/opensearch/ 301 +/user-guide/aws/neptune/ /aws/services/neptune/ 301 +/user-guide/aws/codepipeline/ /aws/services/codepipeline/ 301 +/references/coverage/coverage_docdb/ /aws/services/docdb/ 301 +/references/coverage/coverage_appconfig/ /aws/services/appconfig/ 301 +/references/coverage/coverage_iot/ /aws/services/iot/ 301 +/getting-started/installation/ /aws/getting-started/installation/ 301 /user-guide/integrations/architect/ /aws/integrations/app-frameworks/architect/ 301 -/user-guide/integrations/gitpod/ /aws/integrations/containers/gitpod/ 301 -/user-guide/aws/managedblockchain/ /aws/services/managedblockchain 301 +/user-guide/integrations/gitpod/ /aws/customization/other-installations/ 301 +/user-guide/aws/managedblockchain/ /aws/services/managedblockchain/ 301 /applications/query-data-in-s3-bucket-with-amazon-athena-glue-catalog-cloudformation/ https://github.com/localstack-samples/sample-query-data-s3-athena-glue 301 /academy/localstack-101/web-app-resource-browser/ https://www.youtube.com/watch?list=PLTew28KOwGxPqbkFiW518eeIfiV495bm0&v=SoXtngYp-8k&feature=youtu.be 301 -/user-guide/integrations/ /aws/integrations/ 301 -/user-guide/aws/codebuild/ /aws/services/codebuild 301 -/user-guide/aws/ses/ /aws/services/ses 301 -/references/coverage/coverage_sagemaker-runtime/ /aws/services/sagemaker 301 +/user-guide/integrations/ /aws/customization/integrations/ 301 +/user-guide/aws/codebuild/ /aws/services/codebuild/ 301 +/user-guide/aws/ses/ /aws/services/ses/ 301 +/references/coverage/coverage_sagemaker-runtime/ /aws/services/sagemaker/ 301 /applications/messaging-processing-application-with-sqs-dynamodb-and-fargate/ https://github.com/localstack-samples/sample-cdk-sqs-fargate-dynamodb 301 -/user-guide/aws/mq/ /aws/services/mq 301 -/user-guide/localstack-enterprise/kubernetes-executor/ /aws/enterprise/kubernetes-executor 301 -/user-guide/aws/iot/ /aws/services/iot 301 -/user-guide/aws/backup/ /aws/services/backup 301 -/references/coverage/coverage_organizations/ /aws/services/organizations 301 -/user-guide/aws/kinesisanalytics/ /aws/services/kinesisanalytics 301 -/user-guide/localstack-enterprise/single-sign-on/ /aws/enterprise/sso 301 -/user-guide/aws/redshift/ /aws/services/redshift 301 -/references/coverage/coverage_verifiedpermissions/ /aws/services/verifiedpermissions 301 +/user-guide/aws/mq/ /aws/services/mq/ 301 +/user-guide/localstack-enterprise/kubernetes-executor/ /aws/customization/kubernetes/kubernetes-executor/ 301 +/user-guide/aws/iot/ /aws/services/iot/ 301 +/user-guide/aws/backup/ /aws/services/backup/ 301 +/references/coverage/coverage_organizations/ /aws/services/organizations/ 301 +/user-guide/aws/kinesisanalytics/ /aws/services/kinesisanalytics/ 301 +/user-guide/localstack-enterprise/single-sign-on/ /aws/organizations-admin/sso/ 301 +/user-guide/aws/redshift/ /aws/services/redshift/ 301 +/references/coverage/coverage_verifiedpermissions/ /aws/services/verifiedpermissions/ 301 /academy/localstack-101/full-project-demo/ https://www.youtube.com/watch?list=PLTew28KOwGxPqbkFiW518eeIfiV495bm0&v=cQxg3Dnteyc&feature=youtu.be 301 /applications/full-stack-application-with-aws-lambda-dynamodb-s3-for-shipment-validation/ https://github.com/localstack-samples/sample-shipment-list-demo-lambda-dynamodb-s3 301 /user-guide/integrations/chalice/ /aws/connecting/infrastructure-as-code/aws-chalice/ 301 -/user-guide/security-testing/iam-policy-stream/ /aws/developer-tools/security-testing/iam-policy-stream 301 -/user-guide/security-testing/iam-enforcement/ /aws/developer-tools/security-testing/iam-enforcement 301 -/references/coverage/coverage_route53resolver/ /aws/services/route53resolver 301 -/references/coverage/coverage_config/ /aws/services/config 301 -/references/coverage/coverage_account/ /aws/services/account 301 -/user-guide/web-application/stack-overview/ /aws/connecting/console/stack-overview 301 +/user-guide/security-testing/iam-policy-stream/ /aws/developer-tools/security-testing/iam-policy-stream/ 301 +/user-guide/security-testing/iam-enforcement/ /aws/developer-tools/security-testing/iam-enforcement/ 301 +/references/coverage/coverage_route53resolver/ /aws/services/route53resolver/ 301 +/references/coverage/coverage_config/ /aws/services/config/ 301 +/references/coverage/coverage_account/ /aws/services/account/ 301 +/user-guide/web-application/stack-overview/ /aws/connecting/console/stack-overview/ 301 /academy/localstack-deployment/cloud-pods/ https://www.youtube.com/watch?list=PLTew28KOwGxPdtdW00WNXZLZnstvRQyTF&v=ZJP2xfvwR_g&feature=youtu.be 301 -/user-guide/aws/appconfig/ /aws/services/appconfig 301 -/user-guide/aws/cognito/ /aws/services/cognito-idp 301 -/references/coverage/coverage_bedrock/ /aws/services/bedrock 301 -/user-guide/aws/efs/ /aws/services/efs 301 -/references/coverage/coverage_rds/ /aws/services/rds 301 -/references/coverage/coverage_backup/ /aws/services/backup 301 -/user-guide/aws/rds/ /aws/services/rds 301 -/user-guide/aws/identitystore/ /aws/services/identitystore 301 -/references/coverage/coverage_redshift-data/ /aws/services/redshift 301 -/user-guide/aws/elasticache/ /aws/services/elasticache 301 -/tutorials/using-terraform-with-testcontainers-and-localstack/ /aws/tutorials/using-terraform-with-testcontainers-and-localstack 301 -/references/coverage/coverage_cloudfront/ /aws/services/cloudfront 301 -/user-guide/tools/localstack-sdk/java/ /aws/user-guide/tools/localstack-sdk/java 301 -/references/network-troubleshooting/readme/ /aws/configuration/networking/ 301 -/user-guide/aws/codecommit/ /aws/services/codecommit 301 -/references/coverage/coverage_swf/ /aws/services/swf 301 -/user-guide/integrations/sdks/go/ /aws/connecting/aws-sdks/go 301 +/user-guide/aws/appconfig/ /aws/services/appconfig/ 301 +/user-guide/aws/cognito/ /aws/services/cognito-idp/ 301 +/references/coverage/coverage_bedrock/ /aws/services/bedrock/ 301 +/user-guide/aws/efs/ /aws/services/efs/ 301 +/references/coverage/coverage_rds/ /aws/services/rds/ 301 +/references/coverage/coverage_backup/ /aws/services/backup/ 301 +/user-guide/aws/rds/ /aws/services/rds/ 301 +/user-guide/aws/identitystore/ /aws/services/identitystore/ 301 +/references/coverage/coverage_redshift-data/ /aws/services/redshift/ 301 +/user-guide/aws/elasticache/ /aws/services/elasticache/ 301 +/tutorials/using-terraform-with-testcontainers-and-localstack/ /aws/tutorials/using-terraform-with-testcontainers-and-localstack/ 301 +/references/coverage/coverage_cloudfront/ /aws/services/cloudfront/ 301 +/user-guide/tools/localstack-sdk/java/ /aws/user-guide/tools/localstack-sdk/java/ 301 +/references/network-troubleshooting/readme/ /aws/customization/networking/ 301 +/user-guide/aws/codecommit/ /aws/services/codecommit/ 301 +/references/coverage/coverage_swf/ /aws/services/swf/ 301 +/user-guide/integrations/sdks/go/ /aws/connecting/aws-sdks/go/ 301 /persistence/ /aws/developer-tools/snapshots/persistence/ 301 -/references/init-hooks/ /aws/configuration/config/initialization-hooks/ 301 -/references/coverage/coverage_support/ /aws/services/support 301 +/references/init-hooks/ /aws/customization/advanced/initialization-hooks/ 301 +/references/coverage/coverage_support/ /aws/services/support/ 301 /user-guide/ /aws/ 301 -/user-guide/aws/qldb/ /aws/services/qldb 301 -/tutorials/simulating-outages/ /aws/tutorials/simulating-outages 301 -/user-guide/aws/acm/ /aws/services/acm 301 -/user-guide/integrations/sdks/php/ /aws/connecting/aws-sdks/net/php 301 -/references/coverage/coverage_sns/ /aws/services/sns 301 -/getting-started/help-and-support/ /aws/getting-started/help-support 301 -/user-guide/aws/amplify/ /aws/services/amplify 301 -/references/coverage/coverage_lakeformation/ /aws/services/lakeformation 301 -/user-guide/integrations/sdks/dotnet/ /aws/connecting/aws-sdks/net/dotnet 301 +/user-guide/aws/qldb/ /aws/services/qldb/ 301 +/tutorials/simulating-outages/ /aws/tutorials/simulating-outages/ 301 +/user-guide/aws/acm/ /aws/services/acm/ 301 +/user-guide/integrations/sdks/php/ /aws/connecting/aws-sdks/net/php/ 301 +/references/coverage/coverage_sns/ /aws/services/sns/ 301 +/getting-started/help-and-support/ /aws/getting-started/help-support/ 301 +/user-guide/aws/amplify/ /aws/services/amplify/ 301 +/references/coverage/coverage_lakeformation/ /aws/services/lakeformation/ 301 +/user-guide/integrations/sdks/dotnet/ /aws/connecting/aws-sdks/net/dotnet/ 301 /academy/ https://www.youtube.com/playlist?list=PLTew28KOwGxPqbkFiW518eeIfiV495bm0 301 -/references/coverage/coverage_cloudwatch/ /aws/services/cloudwatch 301 -/user-guide/aws/ecr/ /aws/services/ecr 301 -/user-guide/aws/stepfunctions/ /aws/services/stepfunctions 301 -/references/coverage/coverage_elasticache/ /aws/services/elasticache 301 +/references/coverage/coverage_cloudwatch/ /aws/services/cloudwatch/ 301 +/user-guide/aws/ecr/ /aws/services/ecr/ 301 +/user-guide/aws/stepfunctions/ /aws/services/stepfunctions/ 301 +/references/coverage/coverage_elasticache/ /aws/services/elasticache/ 301 /applications/mnist-handwritten-digit-recognition-model-running-on-a-local-sagemaker-endpoint/ https://github.com/localstack-samples/sample-mnist-digit-recognition-sagemaker 301 -/user-guide/state-management/pods-cli/ /aws/developer-tools/snapshots/cli-commands 301 -/user-guide/aws/dynamodbstreams/ /aws/services/dynamodbstreams 301 -/references/api-key/ /aws/getting-started/auth-token/#how-do-i-activate-older-versions-of-localstack-before-v30 301 -/references/coverage/coverage_eks/ /aws/services/eks 301 -/references/coverage/coverage_cognito-idp/ /aws/services/cognito-idp 301 -/user-guide/web-application/workspace/ /aws/configuration/web-app/workspace 301 -/references/coverage/coverage_cloudcontrol/ /aws/services/cloudcontrol 301 -/tutorials/replicate-aws-resources-localstack-extension/ /aws/tutorials/replicate-aws-resources-localstack-extension 301 -/user-guide/tools/localstack-sdk/python/ /aws/configuration/localstack-sdks/python 301 -/user-guide/lambda-tools/hot-reloading/ /aws/developer-tools/lambda-tools/hot-reloading 301 -/getting-started/quickstart/ /aws/getting-started/quickstart 301 -/overview/ /aws 301 -/user-guide/aws/glue/ /aws/services/glue 301 -/getting-started/ /aws/getting-started 301 -/user-guide/extensions/managing-extensions/ /aws/configuration/extensions/managing-extensions 301 -/references/filesystem/ /aws/configuration/config/filesystem/ 301 -/references/ /aws/configuration/config/ 301 +/user-guide/state-management/pods-cli/ /aws/developer-tools/snapshots/cli-commands/ 301 +/user-guide/aws/dynamodbstreams/ /aws/services/dynamodbstreams/ 301 +/references/api-key/ /aws/getting-started/auth-token/#how-do-i-activate-older-versions-of-localstack-before-v30/ 301 +/references/coverage/coverage_eks/ /aws/services/eks/ 301 +/references/coverage/coverage_cognito-idp/ /aws/services/cognito-idp/ 301 +/user-guide/web-application/workspace/ /aws/organizations-admin/workspaces/ 301 +/references/coverage/coverage_cloudcontrol/ /aws/services/cloudcontrol/ 301 +/tutorials/replicate-aws-resources-localstack-extension/ /aws/tutorials/replicate-aws-resources-localstack-extension/ 301 +/user-guide/tools/localstack-sdk/python/ /aws/customization/integrations/localstack-sdks/python-sdk/ 301 +/user-guide/lambda-tools/hot-reloading/ /aws/developer-tools/lambda-tools/hot-reloading/ 301 +/getting-started/quickstart/ /aws/getting-started/quickstart/ 301 +/overview/ /aws/ 301 +/user-guide/aws/glue/ /aws/services/glue/ 301 +/getting-started/ /aws/getting-started/ 301 +/user-guide/extensions/managing-extensions/ /aws/customization/integrations/extensions/managing-extensions/ 301 +/references/filesystem/ /aws/customization/advanced/filesystem/ 301 +/references/ /aws/customization/ 301 /academy/localstack-101/getting-started/ https://www.youtube.com/watch?v=CzX4mfiS058&feature=youtu.be 301 -/legal/third-party-software-tools /aws/legal/third-party-software-tools 301 -/references/coverage/coverage_elb /aws/services/elb 301 -/user-guide/aws/batch /aws/services/batch 301 -/references/coverage/coverage_scheduler /aws/services/scheduler 301 -/user-guide/extensions /aws/configuration/extensions 301 -/tutorials/s3-static-website-terraform /aws/tutorials/s3-static-website-terraform 301 +/legal/third-party-software-tools /aws/legal/third-party-software-tools/ 301 +/references/coverage/coverage_elb /aws/services/elb/ 301 +/user-guide/aws/batch /aws/services/batch/ 301 +/references/coverage/coverage_scheduler /aws/services/scheduler/ 301 +/user-guide/extensions /aws/customization/integrations/extensions/ 301 +/tutorials/s3-static-website-terraform /aws/tutorials/s3-static-website-terraform/ 301 /references/coverage/coverage_sso-admin /aws/services/sso-admin/ 301 -/references/coverage/coverage_rds-data /aws/services/rds 301 -/references/coverage/coverage_ec2 /aws/services/ec2 301 -/references/licensing /aws/licensing 301 -/legal /aws/legal/third-party-software-tools 301 -/references/coverage/coverage_iotwireless /aws/services/iotwireless 301 -/references/coverage/coverage_mwaa /aws/services/mwaa 301 +/references/coverage/coverage_rds-data /aws/services/rds/ 301 +/references/coverage/coverage_ec2 /aws/services/ec2/ 301 +/references/licensing /aws/licensing/ 301 +/legal /aws/legal/third-party-software-tools/ 301 +/references/coverage/coverage_iotwireless /aws/services/iotwireless/ 301 +/references/coverage/coverage_mwaa /aws/services/mwaa/ 301 /applications/amazon-rds-initialization-using-cdk-lambda-ecr-and-secrets-manager https://github.com/localstack-samples/sample-cdk-rds 301 -/references/coverage/coverage_pipes /aws/services/pipes 301 -/user-guide/state-management/persistence /aws/developer-tools/snapshots/persistence 301 -/references/coverage/coverage_mq /aws/services/mq 301 +/references/coverage/coverage_pipes /aws/services/pipes/ 301 +/user-guide/state-management/persistence /aws/developer-tools/snapshots/persistence/ 301 +/references/coverage/coverage_mq /aws/services/mq/ 301 /academy/localstack-101/what-is-localstack https://www.youtube.com/watch?list=PLTew28KOwGxPqbkFiW518eeIfiV495bm0&v=B2EML5L3-tw&feature=youtu.be 301 -/references/coverage/coverage_xray /aws/services/xray 301 -/references/coverage/coverage_cognito-identity /aws/services/cognito-idp 301 -/user-guide/aws/ecs /aws/services/ecs 301 -/references/usage-tracking /aws/configuration/config/usage-tracking 301 -/user-guide/aws/dms /aws/services/dms 301 -/references/coverage/coverage_managedblockchain /aws/services/managedblockchain 301 +/references/coverage/coverage_xray /aws/services/xray/ 301 +/references/coverage/coverage_cognito-identity /aws/services/cognito-idp/ 301 +/user-guide/aws/ecs /aws/services/ecs/ 301 +/references/usage-tracking /aws/customization/advanced/usage-tracking/ 301 +/user-guide/aws/dms /aws/services/dms/ 301 +/references/coverage/coverage_managedblockchain /aws/services/managedblockchain/ 301 /applications/search-application-with-lambda-kinesis-firehose-elasticsearch-s3 https://github.com/localstack-samples/sample-fuzzy-movie-search-lambda-kinesis-elasticsearch 301 -/references/regions-coverage /aws/configuration/config/regions-coverage/ 301 -/tutorials/elb-load-balancing /aws/tutorials/elb-load-balancing 301 -/references/docker-images /aws/configuration/config/docker-images 301 -/user-guide/aws/eks /aws/services/eks 301 +/references/regions-coverage /aws/customization/advanced/regions-coverage/ 301 +/tutorials/elb-load-balancing /aws/tutorials/elb-load-balancing/ 301 +/references/docker-images /aws/customization/other-installations/docker-images/ 301 +/user-guide/aws/eks /aws/services/eks/ 301 /applications/appsync-graphql-apis-for-dynamodb-and-rds-aurora-postgresql https://github.com/localstack-samples/sample-appsync-graphql-api 301 -/user-guide/aws/cloudfront /aws/services/cloudfront 301 +/user-guide/aws/cloudfront /aws/services/cloudfront/ 301 /applications/note-taking-application-using-aws-sdk-for-javascript https://github.com/localstack-samples/sample-notes-app-dynamodb-lambda-apigateway 301 -/user-guide/state-management/export-import-state /aws/developer-tools/snapshots/export-import-state 301 -/references/coverage/coverage_s3control /aws/services/s3 301 -/references/custom-tls-certificates /aws/developer-tools/security-testing/custom-tls-certificates 301 -/references/coverage/coverage_codecommit /aws/services/codecommit 301 -/user-guide/localstack-enterprise/enterprise-image /aws/enterprise/enterprise-image 301 -/user-guide/tools/testing-utils /aws/configuration/testing-utils 301 -/user-guide/aws/codedeploy /aws/services/codedeploy 301 -/references/coverage/coverage_serverlessrepo /aws/services/serverlessrepo 301 -/user-guide/aws/resource_groups /aws/services/resource_groups 301 -/references/coverage/coverage_glue /aws/services/glue 301 -/user-guide/aws/ssm /aws/services/ssm 301 -/references/coverage/coverage_sts /aws/services/sts 301 +/user-guide/state-management/export-import-state /aws/developer-tools/snapshots/export-import-state/ 301 +/references/coverage/coverage_s3control /aws/services/s3/ 301 +/references/custom-tls-certificates /aws/developer-tools/security-testing/custom-tls-certificates/ 301 +/references/coverage/coverage_codecommit /aws/services/codecommit/ 301 +/user-guide/localstack-enterprise/enterprise-image /aws/customization/other-installations/enterprise-image/ 301 +/user-guide/tools/testing-utils /aws/customization/integrations/localstack-sdks/testing-utils/ 301 +/user-guide/aws/codedeploy /aws/services/codedeploy/ 301 +/references/coverage/coverage_serverlessrepo /aws/services/serverlessrepo/ 301 +/user-guide/aws/resource_groups /aws/services/resource_groups/ 301 +/references/coverage/coverage_glue /aws/services/glue/ 301 +/user-guide/aws/ssm /aws/services/ssm/ 301 +/references/coverage/coverage_sts /aws/services/sts/ 301 /academy/localstack-101/course-overview https://www.youtube.com/watch?list=PLTew28KOwGxPqbkFiW518eeIfiV495bm0&v=VLL-BI1AWcc&feature=youtu.be 301 -/user-guide/aws/iotwireless /aws/services/iotwireless 301 -/user-guide/integrations/sdks/python /aws/connecting/aws-sdks/net/python 301 -/user-guide/integrations/crossplane /aws/connecting/infrastructure-as-code/crossplane 301 -/references/coverage/coverage_elbv2 /aws/services/elb 301 -/user-guide/integrations/openshift /aws/integrations/containers/openshift 301 -/user-guide/aws/memorydb /aws/services/memorydb 301 -/user-guide/integrations/devcontainers /aws/integrations/containers/devcontainers 301 -/references/coverage/coverage_secretsmanager /aws/services/secretsmanager 301 -/user-guide/ci/travis-ci /aws/integrations/continuous-integration/travis-ci 301 +/user-guide/aws/iotwireless /aws/services/iotwireless/ 301 +/user-guide/integrations/sdks/python /aws/connecting/aws-sdks/net/python/ 301 +/user-guide/integrations/crossplane /aws/connecting/infrastructure-as-code/crossplane/ 301 +/references/coverage/coverage_elbv2 /aws/services/elb/ 301 +/user-guide/integrations/openshift /aws/customization/kubernetes/openshift/ 301 +/user-guide/aws/memorydb /aws/services/memorydb/ 301 +/user-guide/integrations/devcontainers /aws/customization/other-installations/devcontainers/ 301 +/references/coverage/coverage_secretsmanager /aws/services/secretsmanager/ 301 +/user-guide/ci/travis-ci /aws/ci-pipelines/travis-ci/ 301 /applications/serverless-microservices-with-amazon-api-gateway-dynamodb-sqs-and-lambda https://github.com/localstack-samples/sample-microservices-apigateway-lambda-dynamodb-sqs 301 -/user-guide/lambda-tools /aws/developer-tools/lambda-tools 301 -/user-guide/integrations/aws-cdk /aws/connecting/infrastructure-as-code/aws-cdk 301 -/references/podman /aws/configuration/config/podman 301 -/references/coverage/coverage_memorydb /aws/services/memorydb 301 -/user-guide/integrations/former2 /aws/connecting/infrastructure-as-code/former2 301 -/user-guide/localstack-enterprise/k8s-operator /aws/enterprise/k8s-operator 301 -/user-guide/integrations/aws-cli /aws/connecting/aws-cli 301 -/references/coverage/coverage_kinesisanalyticsv2 /aws/services/kinesisanalyticsv2 301 -/references/coverage/coverage_amplify /aws/services/amplify 301 -/user-guide/aws/events /aws/services/events 301 -/user-guide/aws/pipes /aws/services/pipes 301 -/user-guide/ci/circle-ci /aws/integrations/continuous-integration/circle-ci 301 -/references/network-troubleshooting/transparent-endpoint-injection /aws/configuration/networking/transparent-endpoint-injection 301 -/references/coverage/coverage_kafka /aws/services/kafka 301 -/references/coverage/coverage_servicediscovery /aws/services/servicediscovery 301 -/references/coverage/coverage_apigateway /aws/services/apigateway 301 -/tutorials /aws/tutorials 301 -/references/coverage/coverage_kinesis /aws/services/kinesis 301 -/references/coverage/coverage_autoscaling /aws/services/autoscaling 301 -/references/coverage/coverage_kms /aws/services/kms 301 +/user-guide/lambda-tools /aws/developer-tools/lambda-tools/ 301 +/user-guide/integrations/aws-cdk /aws/connecting/infrastructure-as-code/aws-cdk/ 301 +/references/podman /aws/customization/other-installations/podman/ 301 +/references/coverage/coverage_memorydb /aws/services/memorydb/ 301 +/user-guide/integrations/former2 /aws/connecting/infrastructure-as-code/former2/ 301 +/user-guide/localstack-enterprise/k8s-operator /aws/customization/kubernetes/kubernetes-operator/ 301 +/user-guide/integrations/aws-cli /aws/connecting/aws-cli/ 301 +/references/coverage/coverage_kinesisanalyticsv2 /aws/services/kinesisanalyticsv2/ 301 +/references/coverage/coverage_amplify /aws/services/amplify/ 301 +/user-guide/aws/events /aws/services/events/ 301 +/user-guide/aws/pipes /aws/services/pipes/ 301 +/user-guide/ci/circle-ci /aws/ci-pipelines/circleci/ 301 +/references/network-troubleshooting/transparent-endpoint-injection /aws/customization/networking/transparent-endpoint-injection/ 301 +/references/coverage/coverage_kafka /aws/services/kafka/ 301 +/references/coverage/coverage_servicediscovery /aws/services/servicediscovery/ 301 +/references/coverage/coverage_apigateway /aws/services/apigateway/ 301 +/tutorials /aws/tutorials/ 301 +/references/coverage/coverage_kinesis /aws/services/kinesis/ 301 +/references/coverage/coverage_autoscaling /aws/services/autoscaling/ 301 +/references/coverage/coverage_kms /aws/services/kms/ 301 /applications/step-up-authentication-using-amazon-cognito https://github.com/localstack-samples/sample-cdk-cognito-dynamodb-api-gateway 301 -/references/coverage/coverage_athena /aws/services/athena 301 -/user-guide/aws/mediastore /aws/services/mediastore 301 -/references/coverage/coverage_fis /aws/services/fis 301 -/user-guide/aws/logs /aws/services/logs 301 +/references/coverage/coverage_athena /aws/services/athena/ 301 +/user-guide/aws/mediastore /aws/services/mediastore/ 301 +/references/coverage/coverage_fis /aws/services/fis/ 301 +/user-guide/aws/logs /aws/services/logs/ 301 /academy/localstack-deployment/infra-cloudformation https://www.youtube.com/watch?list=PLTew28KOwGxPdtdW00WNXZLZnstvRQyTF&v=K0OgQ5eq588&feature=youtu.be 301 -/user-guide/cloud-sandbox /aws/developer-tools/cloud-sandbox 301 -/user-guide/localstack-enterprise/ci-analytics /aws/enterprise/ 301 -/aws/enterprise/ci-analytics /aws/enterprise/ 301 -/references/changelog /aws/changelog 301 -/references/credentials /aws/configuration/config/credentials 301 -/references/coverage/coverage_elasticbeanstalk /aws/services/elasticbeanstalk 301 -/user-guide/web-application/instance-management /aws/configuration/web-app/instance-management 301 -/references/coverage/coverage_qldb /aws/services/qldb 301 +/user-guide/cloud-sandbox /aws/developer-tools/cloud-sandbox/ 301 +/user-guide/localstack-enterprise/ci-analytics /aws/customization/other-installations/ 301 +/aws/enterprise/ci-analytics /aws/customization/other-installations/ 301 +/references/changelog /aws/changelog/ 301 +/references/credentials /aws/connecting/credentials/ 301 +/references/coverage/coverage_elasticbeanstalk /aws/services/elasticbeanstalk/ 301 +/user-guide/web-application/instance-management /aws/connecting/console/instance-management/ 301 +/references/coverage/coverage_qldb /aws/services/qldb/ 301 /academy/localstack-deployment/iam-policy-stream https://www.youtube.com/watch?list=PLTew28KOwGxPdtdW00WNXZLZnstvRQyTF&v=TOBLG2Z6xAM&feature=youtu.be 301 -/references/cross-account-access /aws/configuration/config/cross-account-access 301 -/tutorials/reproducible-machine-learning-cloud-pods /aws/tutorials/reproducible-machine-learning-cloud-pods 301 -/references/coverage/coverage_ecs /aws/services/ecs 301 -/references/coverage/coverage_acm /aws/services/acm 301 -/references/coverage/coverage_cloudtrail /aws/services/cloudtrail 301 +/references/cross-account-access /aws/customization/advanced/cross-account-access/ 301 +/tutorials/reproducible-machine-learning-cloud-pods /aws/tutorials/reproducible-machine-learning-cloud-pods/ 301 +/references/coverage/coverage_ecs /aws/services/ecs/ 301 +/references/coverage/coverage_acm /aws/services/acm/ 301 +/references/coverage/coverage_cloudtrail /aws/services/cloudtrail/ 301 /user-guide/aws /aws/services/ 301 -/references/lambda-provider-v2 /aws/services/lambda 301 -/user-guide/web-application/ci-keys /aws/configuration/web-app/ci-keys 301 +/references/lambda-provider-v2 /aws/services/lambda/ 301 +/user-guide/web-application/ci-keys /aws/organizations-admin/ 301 /academy/localstack-deployment/ls-integrations https://www.youtube.com/watch?v=YV0Zs6UNI9I&feature=youtu.be 301 -/references/coverage/coverage_appconfigdata /aws/services/appconfig 301 +/references/coverage/coverage_appconfigdata /aws/services/appconfig/ 301 /applications/serverless-image-resizer-with-aws-lambda-s3-sns-and-ses https://github.com/localstack-samples/sample-serverless-image-resizer-s3-lambda 301 /user-guide/security-testing /aws/developer-tools/security-testing/ 301 -/user-guide/aws/applicationautoscaling /aws/services/application-autoscaling 301 -/user-guide/aws/bedrock /aws/services/bedrock 301 -/user-guide/aws/sts /aws/services/sts 301 -/user-guide/aws/docdb /aws/services/docdb 301 -/user-guide/tools/transparent-endpoint-injection /aws/configuration/networking/transparent-endpoint-injection 301 -/user-guide/aws/account /aws/services/account 301 -/references/coverage/coverage_efs /aws/services/efs 301 -/user-guide/localstack-enterprise /aws/enterprise/ 301 -/getting-started/auth-token /aws/getting-started/auth-token 301 -/user-guide/localstack-enterprise/enterprise-support /aws/enterprise/enterprise-support 301 -/user-guide/aws/support /aws/services/support 301 -/references/coverage/coverage_resourcegroupstaggingapi /aws/services/resource-groups 301 -/references/external-ports /aws/configuration/networking/external-port-range 301 -/references/coverage/coverage_ce /aws/services/ce 301 -/user-guide/extensions/getting-started /aws/configuration/extensions/getting-started 301 +/user-guide/aws/applicationautoscaling /aws/services/application-autoscaling/ 301 +/user-guide/aws/bedrock /aws/services/bedrock/ 301 +/user-guide/aws/sts /aws/services/sts/ 301 +/user-guide/aws/docdb /aws/services/docdb/ 301 +/user-guide/tools/transparent-endpoint-injection /aws/customization/networking/transparent-endpoint-injection/ 301 +/user-guide/aws/account /aws/services/account/ 301 +/references/coverage/coverage_efs /aws/services/efs/ 301 +/user-guide/localstack-enterprise /aws/customization/other-installations/ 301 +/getting-started/auth-token /aws/getting-started/auth-token/ 301 +/user-guide/localstack-enterprise/enterprise-support /aws/customization/other-installations/ 301 +/user-guide/aws/support /aws/services/support/ 301 +/references/coverage/coverage_resourcegroupstaggingapi /aws/services/resource-groups/ 301 +/references/external-ports /aws/customization/networking/external-port-range/ 301 +/references/coverage/coverage_ce /aws/services/ce/ 301 +/user-guide/extensions/getting-started /aws/customization/integrations/extensions/ 301 /references/coverage/coverage_codeartifact /aws/services/codeartifact/ 301 /user-guide/integrations/sdks /aws/connecting/aws-sdks/ 301 -/user-guide/localstack-enterprise/single-sign-on/azure-ad /aws/enterprise/sso/azure-ad 301 -/user-guide/tools/localstack-desktop /aws/configuration/web-app/localstack-desktop 301 -/references/coverage/coverage_es /aws/services/es 301 -/user-guide/integrations/sdks/javascript /aws/connecting/aws-sdks/net/javascript 301 -/references/coverage/coverage_iam /aws/services/iam 301 -/user-guide/tools/localsurf /aws/configuration/localsurf 301 -/user-guide/extensions/extensions-library /aws/configuration/extensions/extensions-library 301 -/tutorials/ecs-ecr-container-app /aws/tutorials/ecs-ecr-container-app 301 -/references/coverage/coverage_elastictranscoder /aws/services/elastictranscoder 301 +/user-guide/localstack-enterprise/single-sign-on/azure-ad /aws/organizations-admin/sso/azure-ad/ 301 +/user-guide/tools/localstack-desktop /aws/developer-tools/running-localstack/localstack-desktop/ 301 +/references/coverage/coverage_es /aws/services/es/ 301 +/user-guide/integrations/sdks/javascript /aws/connecting/aws-sdks/net/javascript/ 301 +/references/coverage/coverage_iam /aws/services/iam/ 301 +/user-guide/tools/localsurf /aws/customization/networking/localsurf/ 301 +/user-guide/extensions/extensions-library /aws/customization/integrations/extensions/extensions-library/ 301 +/tutorials/ecs-ecr-container-app /aws/tutorials/ecs-ecr-container-app/ 301 +/references/coverage/coverage_elastictranscoder /aws/services/elastictranscoder/ 301 /user-guide/aws/feature-coverage /aws/services/ 301 -/user-guide/aws/lambda /aws/services/lambda 301 +/user-guide/aws/lambda /aws/services/lambda/ 301 /references/iam-coverage /aws/developer-tools/security-testing/iam-coverage/ 301 -/user-guide/aws/transfer /aws/services/transfer 301 -/references/coverage/coverage_batch /aws/services/batch 301 -/references/coverage/coverage_neptune /aws/services/neptune 301 +/user-guide/aws/transfer /aws/services/transfer/ 301 +/references/coverage/coverage_batch /aws/services/batch/ 301 +/references/coverage/coverage_neptune /aws/services/neptune/ 301 /applications/temp /aws/sample-apps/ 301 /applications/serverless-container-based-apis-with-amazon-ecs-api-gateway https://github.com/localstack-samples/sample-terraform-ecs-apigateway 301 -/user-guide/aws/s3 /aws/services/s3 301 -/user-guide/lambda-tools/vscode-extension /aws/connecting/ides/vscode-extension 301 +/user-guide/aws/s3 /aws/services/s3/ 301 +/user-guide/lambda-tools/vscode-extension /aws/connecting/ides/vscode-extension/ 301 /user-guide/chaos-engineering /aws/developer-tools/chaos-engineering/ 301 -/persistence/supported /aws/developer-tools/snapshots/persistence 301 -/user-guide/aws/ce /aws/services/ce 301 -/user-guide/aws/kinesisanalyticsv2 /aws/services/kinesisanalyticsv2 301 -/user-guide/state-management/cloud-pods /aws/developer-tools/snapshots/cloud-pods 301 -/references/coverage/coverage_transcribe /aws/services/transcribe 301 -/references/coverage/coverage_mediastore-data /aws/services/mediastore 301 -/user-guide/aws/route53 /aws/services/route53 301 -/user-guide/aws/config /aws/services/config 301 -/references/coverage/coverage_identitystore /aws/services/identitystore 301 -/references/coverage/coverage_codedeploy /aws/services/codedeploy 301 -/user-guide/aws/msk /aws/services/kafka 301 +/persistence/supported /aws/developer-tools/snapshots/persistence/ 301 +/user-guide/aws/ce /aws/services/ce/ 301 +/user-guide/aws/kinesisanalyticsv2 /aws/services/kinesisanalyticsv2/ 301 +/user-guide/state-management/cloud-pods /aws/developer-tools/snapshots/cloud-pods/ 301 +/references/coverage/coverage_transcribe /aws/services/transcribe/ 301 +/references/coverage/coverage_mediastore-data /aws/services/mediastore/ 301 +/user-guide/aws/route53 /aws/services/route53/ 301 +/user-guide/aws/config /aws/services/config/ 301 +/references/coverage/coverage_identitystore /aws/services/identitystore/ 301 +/references/coverage/coverage_codedeploy /aws/services/codedeploy/ 301 +/user-guide/aws/msk /aws/services/kafka/ 301 /user-guide/state-management /aws/developer-tools/snapshots/ 301 /user-guide/integrations/copilot /aws/connecting/infrastructure-as-code/ 301 -/user-guide/integrations/eksctl /aws/integrations/containers/eksctl/ 301 -/getting-started/faq /aws/getting-started/faq 301 -/user-guide/aws/elb /aws/services/elb 301 -/user-guide/integrations/kubernetes /aws/integrations/containers/kubernetes/ 301 -/user-guide/aws/lakeformation /aws/services/lakeformation 301 -/developer-hub /aws/sample-apps 301 -/references/coverage/coverage_firehose /aws/services/firehose 301 -/user-guide/aws/verifiedpermissions /aws/services/verifiedpermissions 301 -/references/coverage/coverage_kinesisanalytics /aws/services/kinesisanalytics 301 -/user-guide/aws/sns /aws/services/sns 301 -/user-guide/tools/aws-replicator /aws/developer-tools/aws-replicator 301 -/user-guide/integrations/serverless-framework /aws/connecting/infrastructure-as-code/serverless-framework 301 -/references/coverage/coverage_sqs /aws/services/sqs 301 -/user-guide/aws/appsync /aws/services/appsync 301 -/tutorials/schema-evolution-glue-msk /aws/tutorials/schema-evolution-glue-msk 301 -/user-guide/ci/bitbucket /aws/integrations/continuous-integration/bitbucket 301 +/user-guide/integrations/eksctl /aws/customization/kubernetes/eksctl/ 301 +/getting-started/faq /aws/getting-started/faq/ 301 +/user-guide/aws/elb /aws/services/elb/ 301 +/user-guide/integrations/kubernetes /aws/customization/kubernetes/ 301 +/user-guide/aws/lakeformation /aws/services/lakeformation/ 301 +/developer-hub /aws/sample-apps/ 301 +/references/coverage/coverage_firehose /aws/services/firehose/ 301 +/user-guide/aws/verifiedpermissions /aws/services/verifiedpermissions/ 301 +/references/coverage/coverage_kinesisanalytics /aws/services/kinesisanalytics/ 301 +/user-guide/aws/sns /aws/services/sns/ 301 +/user-guide/tools/aws-replicator /aws/developer-tools/aws-replicator/ 301 +/user-guide/integrations/serverless-framework /aws/connecting/infrastructure-as-code/serverless-framework/ 301 +/references/coverage/coverage_sqs /aws/services/sqs/ 301 +/user-guide/aws/appsync /aws/services/appsync/ 301 +/tutorials/schema-evolution-glue-msk /aws/tutorials/schema-evolution-glue-msk/ 301 +/user-guide/ci/bitbucket /aws/ci-pipelines/bitbucket/ 301 /contributing https://github.com/localstack/localstack/blob/master/docs/CONTRIBUTING.md 301 -/user-guide/aws/scheduler /aws/services/scheduler 301 -/user-guide/integrations/quarkus /aws/integrations/app-frameworks/quarkus 301 -/user-guide/aws/servicediscovery /aws/services/servicediscovery 301 +/user-guide/aws/scheduler /aws/services/scheduler/ 301 +/user-guide/integrations/quarkus /aws/integrations/app-frameworks/quarkus/ 301 +/user-guide/aws/servicediscovery /aws/services/servicediscovery/ 301 /academy/localstack-101 https://www.youtube.com/playlist?list=PLTew28KOwGxPqbkFiW518eeIfiV495bm0&si=rKhzdxOJsfO_pgyk 301 -/user-guide/aws/xray /aws/services/xray 301 -/user-guide/aws/pca /aws/services/acm-pca 301 -/user-guide/aws/waf /aws/services/waf 301 +/user-guide/aws/xray /aws/services/xray/ 301 +/user-guide/aws/pca /aws/services/acm-pca/ 301 +/user-guide/aws/waf /aws/services/waf/ 301 /applications/event-driven-architecture-with-amazon-sns-fifo-dynamodb-lambda-and-s3 https://github.com/localstack-samples/sample-sam-sns-fifo-dynamodb-lambda 301 -/user-guide/aws/apigateway /aws/services/apigateway 301 +/user-guide/aws/apigateway /aws/services/apigateway/ 301 /user-guide/integrations/cloud-custodian /aws/connecting/infrastructure-as-code/cloud-custodian/ 301 -/references/coverage/coverage_lambda /aws/services/lambda 301 -/user-guide/integrations/sdks/java /aws/connecting/aws-sdks/net/java 301 -/references/coverage/coverage_logs /aws/services/logs 301 -/references/coverage/coverage_mediastore /aws/services/mediastore 301 -/user-guide/integrations/kafka /aws/integrations/messaging/selfmanaged-kafka-cluster/ 301 -/user-guide/chaos-engineering/fault-injection-service /aws/developer-tools/chaos-engineering/fault-injection-service 301 -/references/logging /aws/configuration/config/logging 301 -/tutorials/java-notification-app /aws/tutorials/java-notification-app 301 +/references/coverage/coverage_lambda /aws/services/lambda/ 301 +/user-guide/integrations/sdks/java /aws/connecting/aws-sdks/net/java/ 301 +/references/coverage/coverage_logs /aws/services/logs/ 301 +/references/coverage/coverage_mediastore /aws/services/mediastore/ 301 +/user-guide/integrations/kafka /aws/customization/integrations/app-frameworks/selfmanaged-kafka-cluster/ 301 +/user-guide/chaos-engineering/fault-injection-service /aws/developer-tools/chaos-engineering/fault-injection-service/ 301 +/references/logging /aws/customization/logging/ 301 +/tutorials/java-notification-app /aws/tutorials/java-notification-app/ 301 /applications/serverless-transcription-application-using-transcribe-s3-lambda-sqs-and-ses https://github.com/localstack-samples/sample-serverless-transcribe 301 -/user-guide/aws/route53resolver /aws/services/route53resolver 301 -/references/coverage/coverage_wafv2 /aws/services/waf 301 -/user-guide/integrations/sdks/cpp /aws/connecting/aws-sdks/net/cpp 301 -/user-guide/integrations/testcontainers /aws/integrations/testing/testcontainers 301 -/references/internal-endpoints /aws/configuration/networking/internal-endpoints 301 -/tutorials/lambda-ecr-container-images /aws/tutorials/lambda-ecr-container-images 301 -/user-guide/aws/fis /aws/services/fis 301 -/user-guide/tools/localstack-docker-extension /aws/configuration/localstack-docker-extension/ 301 -/user-guide/aws/cloudformation /aws/services/cloudformation 301 -/tutorials/route-53-failover /aws/tutorials/route-53-failover 301 -/user-guide/web-application/resource-browser /aws/connecting/console/resource-browser 301 +/user-guide/aws/route53resolver /aws/services/route53resolver/ 301 +/references/coverage/coverage_wafv2 /aws/services/waf/ 301 +/user-guide/integrations/sdks/cpp /aws/connecting/aws-sdks/net/cpp/ 301 +/user-guide/integrations/testcontainers /aws/integrations/testing/testcontainers/ 301 +/references/internal-endpoints /aws/customization/networking/internal-endpoints/ 301 +/tutorials/lambda-ecr-container-images /aws/tutorials/lambda-ecr-container-images/ 301 +/user-guide/aws/fis /aws/services/fis/ 301 +/user-guide/tools/localstack-docker-extension /aws/customization/other-installations/localstack-docker-extension/ 301 +/user-guide/aws/cloudformation /aws/services/cloudformation/ 301 +/tutorials/route-53-failover /aws/tutorials/route-53-failover/ 301 +/user-guide/web-application/resource-browser /aws/connecting/console/resource-browser/ 301 /applications/loan-broker-application-with-aws-step-functions-dynamodb-lambda-sqs-and-sns https://github.com/localstack-samples/sample-loan-broker-stepfunctions-lambda 301 -/references/coverage/coverage_resource-groups /aws/services/resource-groups 301 -/user-guide/state-management/support /aws/developer-tools/snapshots/persistence-coverage 301 -/references/coverage/coverage_redshift /aws/services/redshift 301 +/references/coverage/coverage_resource-groups /aws/services/resource-groups/ 301 +/user-guide/state-management/support /aws/developer-tools/snapshots/persistence-coverage/ 301 +/references/coverage/coverage_redshift /aws/services/redshift/ 301 /user-guide/integrations/lambdatest-hyperexecute /aws/integrations/testing/lambdatest-hyperexecute/ 301 /applications /aws/sample-apps/ 301 -/user-guide/web-application/users-and-licenses /aws/configuration/web-app/users-and-licenses 301 -/user-guide/tools/localstack-sdk /aws/configuration/localstack-sdks/ 301 -/references/coverage/coverage_apigatewaymanagementapi /aws/services/apigateway 301 -/references/coverage/coverage_transfer /aws/services/transfer 301 +/user-guide/web-application/users-and-licenses /aws/organizations-admin/managing-users-licenses/ 301 +/user-guide/tools/localstack-sdk /aws/customization/integrations/localstack-sdks/ 301 +/references/coverage/coverage_apigatewaymanagementapi /aws/services/apigateway/ 301 +/references/coverage/coverage_transfer /aws/services/transfer/ 301 /references/coverage/coverage_codeconnections /aws/services/codeconnections/ 301 -/user-guide/aws/athena /aws/services/athena 301 -/user-guide/extensions/official-extensions /aws/configuration/extensions/official-extensions 301 -/user-guide/aws/textract /aws/services/textract 301 -/tutorials/iam-policy-stream /aws/tutorials/iam-policy-stream 301 -/references/coverage/coverage_ses /aws/services/ses 301 -/tutorials/gitlab_ci_testcontainers /aws/tutorials/gitlab-ci-testcontainers 301 -/user-guide/integrations/aws-sam /aws/connecting/infrastructure-as-code/aws-sam 301 -/user-guide/aws/firehose /aws/services/firehose 301 -/user-guide/web-application /aws/configuration/web-app/ 301 -/references/coverage/coverage_sagemaker /aws/services/sagemaker 301 -/references/arm64-support /aws/configuration/config/arm64-support/ 301 -/user-guide/aws/shield /aws/services/shield 301 -/user-guide/integrations/terraform /aws/connecting/infrastructure-as-code/terraform 301 -/user-guide/aws/es /aws/services/es 301 -/references/coverage/coverage_dms /aws/services/dms 301 -/user-guide/extensions/developing-extensions /aws/configuration/extensions/developing-extensions 301 -/user-guide/security-testing/explainable-iam /aws/developer-tools/security-testing/explainable-iam 301 -/user-guide/aws/ram /aws/services/ram 301 -/references/coverage/coverage_ssm /aws/services/ssm 301 -/references/network-troubleshooting/created-resources /aws/configuration/networking/created-resources 301 -/user-guide/aws/swf /aws/services/swf 301 -/user-guide/ci/github-actions /aws/integrations/continuous-integration/github-actions 301 -/user-guide/aws/serverlessrepo /aws/services/serverlessrepo 301 -/user-guide/aws/sqs /aws/services/sqs 301 -/references/coverage/coverage_ram /aws/services/ram 301 -/user-guide/aws/secretsmanager /aws/services/secretsmanager 301 -/user-guide/web-application/stack-insights /aws/configuration/web-app/stack-insights 301 -/user-guide/aws/autoscaling /aws/services/autoscaling 301 -/references/coverage/coverage_opensearch /aws/services/opensearch 301 +/user-guide/aws/athena /aws/services/athena/ 301 +/user-guide/extensions/official-extensions /aws/customization/integrations/extensions/extensions-library/ 301 +/user-guide/aws/textract /aws/services/textract/ 301 +/tutorials/iam-policy-stream /aws/tutorials/iam-policy-stream/ 301 +/references/coverage/coverage_ses /aws/services/ses/ 301 +/tutorials/gitlab_ci_testcontainers /aws/tutorials/gitlab-ci-testcontainers/ 301 +/user-guide/integrations/aws-sam /aws/connecting/infrastructure-as-code/aws-sam/ 301 +/user-guide/aws/firehose /aws/services/firehose/ 301 +/user-guide/web-application /aws/organizations-admin/ 301 +/references/coverage/coverage_sagemaker /aws/services/sagemaker/ 301 +/references/arm64-support /aws/customization/advanced/arm64-support/ 301 +/user-guide/aws/shield /aws/services/shield/ 301 +/user-guide/integrations/terraform /aws/connecting/infrastructure-as-code/terraform/ 301 +/user-guide/aws/es /aws/services/es/ 301 +/references/coverage/coverage_dms /aws/services/dms/ 301 +/user-guide/extensions/developing-extensions /aws/customization/integrations/extensions/developing-extensions/ 301 +/user-guide/security-testing/explainable-iam /aws/developer-tools/security-testing/explainable-iam/ 301 +/user-guide/aws/ram /aws/services/ram/ 301 +/references/coverage/coverage_ssm /aws/services/ssm/ 301 +/references/network-troubleshooting/created-resources /aws/customization/networking/accessing-resources-created/ 301 +/user-guide/aws/swf /aws/services/swf/ 301 +/user-guide/ci/github-actions /aws/ci-pipelines/github-actions/ 301 +/user-guide/aws/serverlessrepo /aws/services/serverlessrepo/ 301 +/user-guide/aws/sqs /aws/services/sqs/ 301 +/references/coverage/coverage_ram /aws/services/ram/ 301 +/user-guide/aws/secretsmanager /aws/services/secretsmanager/ 301 +/user-guide/web-application/stack-insights /aws/organizations-admin/stack-insights/ 301 +/user-guide/aws/autoscaling /aws/services/autoscaling/ 301 +/references/coverage/coverage_opensearch /aws/services/opensearch/ 301 /academy/localstack-101/cloud-pods https://www.youtube.com/watch?list=PLTew28KOwGxPqbkFiW518eeIfiV495bm0&v=InqTdSvxuag&feature=youtu.be 301 -/references/coverage/coverage_emr-serverless /aws/services/emr 301 -/user-guide/aws/cloudwatch /aws/services/cloudwatch 301 -/user-guide/aws/elasticbeanstalk /aws/services/elasticbeanstalk 301 -/references/coverage/coverage_mediaconvert /aws/services/mediaconvert 301 -/user-guide/state-management/launchpad /aws/developer-tools/snapshots/launchpad 301 -/user-guide/ci/codebuild /aws/integrations/continuous-integration/codebuild 301 -/user-guide/aws/iot-data /aws/services/iot-data 301 -/references/coverage/coverage_textract /aws/services/textract 301 -/references/coverage/coverage_codebuild /aws/services/codebuild 301 -/user-guide/aws/elastictranscoder /aws/services/elastictranscoder 301 -/references/coverage/coverage_glacier /aws/services/glacier 301 +/references/coverage/coverage_emr-serverless /aws/services/emr/ 301 +/user-guide/aws/cloudwatch /aws/services/cloudwatch/ 301 +/user-guide/aws/elasticbeanstalk /aws/services/elasticbeanstalk/ 301 +/references/coverage/coverage_mediaconvert /aws/services/mediaconvert/ 301 +/user-guide/state-management/launchpad /aws/developer-tools/snapshots/launchpad/ 301 +/user-guide/ci/codebuild /aws/ci-pipelines/codebuild/ 301 +/user-guide/aws/iot-data /aws/services/iot-data/ 301 +/references/coverage/coverage_textract /aws/services/textract/ 301 +/references/coverage/coverage_codebuild /aws/services/codebuild/ 301 +/user-guide/aws/elastictranscoder /aws/services/elastictranscoder/ 301 +/references/coverage/coverage_glacier /aws/services/glacier/ 301 /user-guide/tools /aws/developer-tools/ 301 -/user-guide/aws/timestream /aws/services/timestream-query 301 -/references/coverage/coverage_pinpoint /aws/services/pinpoint 301 +/user-guide/aws/timestream /aws/services/timestream-query/ 301 +/references/coverage/coverage_pinpoint /aws/services/pinpoint/ 301 /applications/serverless-rds-proxy-with-api-gateway-lambda-and-aurora-rds https://github.com/localstack-samples/sample-serverless-rds-proxy-demo 301 /academy/localstack-101/why-localstack https://www.youtube.com/watch?list=PLTew28KOwGxPqbkFiW518eeIfiV495bm0&v=EDGIBpUpYWU&feature=youtu.be 301 -/user-guide/aws/transcribe /aws/services/transcribe 301 -/references/coverage/coverage_cloudformation /aws/services/cloudformation 301 -/references/coverage/coverage_apigatewayv2 /aws/services/apigateway 301 -/user-guide/aws/kinesis /aws/services/kinesis 301 -/references/coverage/coverage_bedrock-runtime /aws/services/bedrock 301 -/references/coverage/coverage_iot-data /aws/services/iot-data 301 -/user-guide/cloud-sandbox/ephemeral-instance /aws/developer-tools/cloud-sandbox/ephemeral-instance 301 -/references/coverage/coverage_timestream-write /aws/services/timestream-query 301 -/user-guide/aws/pinpoint /aws/services/pinpoint 301 -/tutorials/cloud-pods-collaborative-debugging /aws/tutorials/cloud-pods-collaborative-debugging 301 -/references/coverage/coverage_emr /aws/services/emr 301 -/user-guide/aws/iam /aws/services/iam 301 +/user-guide/aws/transcribe /aws/services/transcribe/ 301 +/references/coverage/coverage_cloudformation /aws/services/cloudformation/ 301 +/references/coverage/coverage_apigatewayv2 /aws/services/apigateway/ 301 +/user-guide/aws/kinesis /aws/services/kinesis/ 301 +/references/coverage/coverage_bedrock-runtime /aws/services/bedrock/ 301 +/references/coverage/coverage_iot-data /aws/services/iot-data/ 301 +/user-guide/cloud-sandbox/ephemeral-instance /aws/developer-tools/cloud-sandbox/ephemeral-instance/ 301 +/references/coverage/coverage_timestream-write /aws/services/timestream-query/ 301 +/user-guide/aws/pinpoint /aws/services/pinpoint/ 301 +/tutorials/cloud-pods-collaborative-debugging /aws/tutorials/cloud-pods-collaborative-debugging/ 301 +/references/coverage/coverage_emr /aws/services/emr/ 301 +/user-guide/aws/iam /aws/services/iam/ 301 /academy/localstack-deployment/course-overview https://www.youtube.com/watch?list=PLTew28KOwGxPdtdW00WNXZLZnstvRQyTF&v=XDIat6laW28&feature=youtu.be 301 -/references/coverage/coverage_codepipeline /aws/services/codepipeline 301 +/references/coverage/coverage_codepipeline /aws/services/codepipeline/ 301 /academy/localstack-deployment/infra-terraform https://www.youtube.com/watch?list=PLTew28KOwGxPdtdW00WNXZLZnstvRQyTF&v=lsF3kewOeBU&feature=youtu.be 301 -/references/network-troubleshooting /aws/configuration/networking/ 301 -/user-guide/ci/gitlab-ci /aws/integrations/continuous-integration/gitlab-ci 301 -/user-guide/aws/kms /aws/services/kms 301 -/references/coverage/coverage_stepfunctions /aws/services/stepfunctions 301 -/references/coverage/coverage_sesv2 /aws/services/ses 301 -/references/coverage/coverage_events /aws/services/events 301 -/references/coverage/coverage_timestream-query /aws/services/timestream-query 301 -/references/network-troubleshooting/endpoint-url /aws/configuration/networking/endpoint-url 301 -/tutorials/ephemeral-application-previews /aws/tutorials/ephemeral-application-previews 301 -/user-guide/web-application/accounts /aws/configuration/web-app/accounts 301 -/references/coverage/coverage_appsync /aws/services/appsync 301 -/references/coverage/coverage_ecr /aws/services/ecr 301 +/references/network-troubleshooting /aws/customization/networking/ 301 +/user-guide/ci/gitlab-ci /aws/ci-pipelines/gitlab-ci/ 301 +/user-guide/aws/kms /aws/services/kms/ 301 +/references/coverage/coverage_stepfunctions /aws/services/stepfunctions/ 301 +/references/coverage/coverage_sesv2 /aws/services/ses/ 301 +/references/coverage/coverage_events /aws/services/events/ 301 +/references/coverage/coverage_timestream-query /aws/services/timestream-query/ 301 +/references/network-troubleshooting/endpoint-url /aws/customization/networking/accessing-endpoint-url/ 301 +/tutorials/ephemeral-application-previews /aws/tutorials/ephemeral-application-previews/ 301 +/user-guide/web-application/accounts /aws/organizations-admin/accounts/ 301 +/references/coverage/coverage_appsync /aws/services/appsync/ 301 +/references/coverage/coverage_ecr /aws/services/ecr/ 301 /academy/localstack-deployment https://www.youtube.com/playlist?list=PLTew28KOwGxPdtdW00WNXZLZnstvRQyTF&si=R-Ed-JQKOxXP473O 301 -/references/coverage/coverage_application-autoscaling /aws/services/application-autoscaling 301 -/user-guide/lambda-tools/debugging /aws/developer-tools/lambda-tools/debugging 301 +/references/coverage/coverage_application-autoscaling /aws/services/application-autoscaling/ 301 +/user-guide/lambda-tools/debugging /aws/developer-tools/lambda-tools/debugging/ 301 /references/coverage/coverage_codestar-connections /aws/services/codeconnections/ 301 -/user-guide/integrations/rancher-desktop /aws/integrations/containers/rancher-desktop 301 -/user-guide/integrations/sdks/ruby /aws/connecting/aws-sdks/net/ruby 301 -/user-guide/aws/mwaa /aws/services/mwaa 301 +/user-guide/integrations/rancher-desktop /aws/customization/other-installations/rancher-desktop/ 301 +/user-guide/integrations/sdks/ruby /aws/connecting/aws-sdks/net/ruby/ 301 +/user-guide/aws/mwaa /aws/services/mwaa/ 301 /academy/localstack-deployment/deploy-app-ls https://www.youtube.com/watch?list=PLTew28KOwGxPdtdW00WNXZLZnstvRQyTF&v=qIB79b-iw2U&feature=youtu.be 301 -/user-guide/aws/organizations /aws/services/organizations 301 +/user-guide/aws/organizations /aws/services/organizations/ 301 /academy/localstack-deployment/github-action-ls https://www.youtube.com/watch?list=PLTew28KOwGxPdtdW00WNXZLZnstvRQyTF&v=XNh8aSaT9v0&feature=youtu.be 301 -/user-guide/aws/sagemaker /aws/services/sagemaker 301 -/references/configuration /aws/configuration/config/configuration 301 -/user-guide/chaos-engineering/chaos-api /aws/developer-tools/chaos-engineering/chaos-api 301 -/user-guide/aws/glacier /aws/services/glacier 301 -/references/coverage/coverage_qldb-session /aws/services/qldb 301 -/user-guide/integrations/pulumi /aws/connecting/infrastructure-as-code/pulumi 301 -/user-guide/aws/cloudtrail /aws/services/cloudtrail 301 -/references/coverage/coverage_s3 /aws/services/s3 301 -/user-guide/aws/emr /aws/services/emr 301 -/user-guide/tools/dns-server /aws/configuration/dns-server 301 -/user-guide/chaos-engineering/chaos-application-dashboard /aws/developer-tools/chaos-engineering/chaos-application-dashboard 301 -/references/coverage/coverage_route53 /aws/services/route53 301 -/references/coverage/coverage_dynamodbstreams /aws/services/dynamodbstreams 301 -/references/coverage/coverage_dynamodb /aws/services/dynamodb 301 -/user-guide/aws/ec2 /aws/services/ec2 301 +/user-guide/aws/sagemaker /aws/services/sagemaker/ 301 +/references/configuration /aws/customization/configuration-options/ 301 +/user-guide/chaos-engineering/chaos-api /aws/developer-tools/chaos-engineering/chaos-api/ 301 +/user-guide/aws/glacier /aws/services/glacier/ 301 +/references/coverage/coverage_qldb-session /aws/services/qldb/ 301 +/user-guide/integrations/pulumi /aws/connecting/infrastructure-as-code/pulumi/ 301 +/user-guide/aws/cloudtrail /aws/services/cloudtrail/ 301 +/references/coverage/coverage_s3 /aws/services/s3/ 301 +/user-guide/aws/emr /aws/services/emr/ 301 +/user-guide/tools/dns-server /aws/customization/networking/dns-server/ 301 +/user-guide/chaos-engineering/chaos-application-dashboard /aws/developer-tools/chaos-engineering/chaos-application-dashboard/ 301 +/references/coverage/coverage_route53 /aws/services/route53/ 301 +/references/coverage/coverage_dynamodbstreams /aws/services/dynamodbstreams/ 301 +/references/coverage/coverage_dynamodb /aws/services/dynamodb/ 301 +/user-guide/aws/ec2 /aws/services/ec2/ 301 /user-guide/cloud-sandbox/application-previews /aws/developer-tools/cloud-sandbox/app-preview/ 301 -/user-guide/integrations/spring-cloud-function /aws/integrations/app-frameworks/spring-cloud-function 301 -/references/multi-account-setups /aws/configuration/config/multi-account-setups/ 301 -/user-guide/aws/elementalmediaconvert /aws/services/mediaconvert 301 -/references/coverage/coverage_shield /aws/services/shield 301 -/user-guide/aws/dynamodb /aws/services/dynamodb 301 +/user-guide/integrations/spring-cloud-function /aws/integrations/app-frameworks/spring-cloud-function/ 301 +/references/multi-account-setups /aws/customization/advanced/multi-account-setups/ 301 +/user-guide/aws/elementalmediaconvert /aws/services/mediaconvert/ 301 +/references/coverage/coverage_shield /aws/services/shield/ 301 +/user-guide/aws/dynamodb /aws/services/dynamodb/ 301 /aws/tooling/event-studio /aws/developer-tools/app-inspector/ 301 /references/coverage /aws/services/ 301 -/references/coverage/coverage_acm-pca /aws/services/acm-pca 301 -/user-guide/aws/opensearch /aws/services/opensearch 301 -/user-guide/aws/neptune /aws/services/neptune 301 -/user-guide/aws/codepipeline /aws/services/codepipeline 301 -/references/coverage/coverage_docdb /aws/services/docdb 301 -/references/coverage/coverage_appconfig /aws/services/appconfig 301 -/references/coverage/coverage_iot /aws/services/iot 301 -/getting-started/installation /aws/getting-started/installation 301 +/references/coverage/coverage_acm-pca /aws/services/acm-pca/ 301 +/user-guide/aws/opensearch /aws/services/opensearch/ 301 +/user-guide/aws/neptune /aws/services/neptune/ 301 +/user-guide/aws/codepipeline /aws/services/codepipeline/ 301 +/references/coverage/coverage_docdb /aws/services/docdb/ 301 +/references/coverage/coverage_appconfig /aws/services/appconfig/ 301 +/references/coverage/coverage_iot /aws/services/iot/ 301 +/getting-started/installation /aws/getting-started/installation/ 301 /user-guide/integrations/architect /aws/integrations/app-frameworks/architect/ 301 -/user-guide/integrations/gitpod /aws/integrations/containers/gitpod/ 301 -/user-guide/aws/managedblockchain /aws/services/managedblockchain 301 +/user-guide/integrations/gitpod /aws/customization/other-installations/ 301 +/user-guide/aws/managedblockchain /aws/services/managedblockchain/ 301 /applications/query-data-in-s3-bucket-with-amazon-athena-glue-catalog-cloudformation https://github.com/localstack-samples/sample-query-data-s3-athena-glue 301 /academy/localstack-101/web-app-resource-browser https://www.youtube.com/watch?list=PLTew28KOwGxPqbkFiW518eeIfiV495bm0&v=SoXtngYp-8k&feature=youtu.be 301 -/user-guide/integrations /aws/integrations/ 301 -/user-guide/aws/codebuild /aws/services/codebuild 301 -/user-guide/aws/ses /aws/services/ses 301 -/references/coverage/coverage_sagemaker-runtime /aws/services/sagemaker 301 +/user-guide/integrations /aws/customization/integrations/ 301 +/user-guide/aws/codebuild /aws/services/codebuild/ 301 +/user-guide/aws/ses /aws/services/ses/ 301 +/references/coverage/coverage_sagemaker-runtime /aws/services/sagemaker/ 301 /applications/messaging-processing-application-with-sqs-dynamodb-and-fargate https://github.com/localstack-samples/sample-cdk-sqs-fargate-dynamodb 301 -/user-guide/aws/mq /aws/services/mq 301 -/user-guide/localstack-enterprise/kubernetes-executor /aws/enterprise/kubernetes-executor 301 -/user-guide/aws/iot /aws/services/iot 301 -/user-guide/aws/backup /aws/services/backup 301 -/references/coverage/coverage_organizations /aws/services/organizations 301 -/user-guide/aws/kinesisanalytics /aws/services/kinesisanalytics 301 -/user-guide/localstack-enterprise/single-sign-on /aws/enterprise/sso 301 -/user-guide/aws/redshift /aws/services/redshift 301 -/references/coverage/coverage_verifiedpermissions /aws/services/verifiedpermissions 301 +/user-guide/aws/mq /aws/services/mq/ 301 +/user-guide/localstack-enterprise/kubernetes-executor /aws/customization/kubernetes/kubernetes-executor/ 301 +/user-guide/aws/iot /aws/services/iot/ 301 +/user-guide/aws/backup /aws/services/backup/ 301 +/references/coverage/coverage_organizations /aws/services/organizations/ 301 +/user-guide/aws/kinesisanalytics /aws/services/kinesisanalytics/ 301 +/user-guide/localstack-enterprise/single-sign-on /aws/organizations-admin/sso/ 301 +/user-guide/aws/redshift /aws/services/redshift/ 301 +/references/coverage/coverage_verifiedpermissions /aws/services/verifiedpermissions/ 301 /academy/localstack-101/full-project-demo https://www.youtube.com/watch?list=PLTew28KOwGxPqbkFiW518eeIfiV495bm0&v=cQxg3Dnteyc&feature=youtu.be 301 /applications/full-stack-application-with-aws-lambda-dynamodb-s3-for-shipment-validation https://github.com/localstack-samples/sample-shipment-list-demo-lambda-dynamodb-s3 301 /user-guide/integrations/chalice /aws/connecting/infrastructure-as-code/aws-chalice/ 301 -/user-guide/security-testing/iam-policy-stream /aws/developer-tools/security-testing/iam-policy-stream 301 -/user-guide/security-testing/iam-enforcement /aws/developer-tools/security-testing/iam-enforcement 301 -/references/coverage/coverage_route53resolver /aws/services/route53resolver 301 -/references/coverage/coverage_config /aws/services/config 301 -/references/coverage/coverage_account /aws/services/account 301 -/user-guide/web-application/stack-overview /aws/connecting/console/stack-overview 301 +/user-guide/security-testing/iam-policy-stream /aws/developer-tools/security-testing/iam-policy-stream/ 301 +/user-guide/security-testing/iam-enforcement /aws/developer-tools/security-testing/iam-enforcement/ 301 +/references/coverage/coverage_route53resolver /aws/services/route53resolver/ 301 +/references/coverage/coverage_config /aws/services/config/ 301 +/references/coverage/coverage_account /aws/services/account/ 301 +/user-guide/web-application/stack-overview /aws/connecting/console/stack-overview/ 301 /academy/localstack-deployment/cloud-pods https://www.youtube.com/watch?list=PLTew28KOwGxPdtdW00WNXZLZnstvRQyTF&v=ZJP2xfvwR_g&feature=youtu.be 301 -/user-guide/aws/appconfig /aws/services/appconfig 301 -/user-guide/aws/cognito /aws/services/cognito-idp 301 -/references/coverage/coverage_bedrock /aws/services/bedrock 301 -/user-guide/aws/efs /aws/services/efs 301 -/references/coverage/coverage_rds /aws/services/rds 301 -/references/coverage/coverage_backup /aws/services/backup 301 -/user-guide/aws/rds /aws/services/rds 301 -/user-guide/aws/identitystore /aws/services/identitystore 301 -/references/coverage/coverage_redshift-data /aws/services/redshift 301 -/user-guide/aws/elasticache /aws/services/elasticache 301 -/tutorials/using-terraform-with-testcontainers-and-localstack /aws/tutorials/using-terraform-with-testcontainers-and-localstack 301 -/references/coverage/coverage_cloudfront /aws/services/cloudfront 301 -/user-guide/tools/localstack-sdk/java /aws/user-guide/tools/localstack-sdk/java 301 -/references/network-troubleshooting/readme /aws/configuration/networking/ 301 -/user-guide/aws/codecommit /aws/services/codecommit 301 -/references/coverage/coverage_swf /aws/services/swf 301 -/user-guide/integrations/sdks/go /aws/connecting/aws-sdks/go 301 +/user-guide/aws/appconfig /aws/services/appconfig/ 301 +/user-guide/aws/cognito /aws/services/cognito-idp/ 301 +/references/coverage/coverage_bedrock /aws/services/bedrock/ 301 +/user-guide/aws/efs /aws/services/efs/ 301 +/references/coverage/coverage_rds /aws/services/rds/ 301 +/references/coverage/coverage_backup /aws/services/backup/ 301 +/user-guide/aws/rds /aws/services/rds/ 301 +/user-guide/aws/identitystore /aws/services/identitystore/ 301 +/references/coverage/coverage_redshift-data /aws/services/redshift/ 301 +/user-guide/aws/elasticache /aws/services/elasticache/ 301 +/tutorials/using-terraform-with-testcontainers-and-localstack /aws/tutorials/using-terraform-with-testcontainers-and-localstack/ 301 +/references/coverage/coverage_cloudfront /aws/services/cloudfront/ 301 +/user-guide/tools/localstack-sdk/java /aws/user-guide/tools/localstack-sdk/java/ 301 +/references/network-troubleshooting/readme /aws/customization/networking/ 301 +/user-guide/aws/codecommit /aws/services/codecommit/ 301 +/references/coverage/coverage_swf /aws/services/swf/ 301 +/user-guide/integrations/sdks/go /aws/connecting/aws-sdks/go/ 301 /persistence /aws/developer-tools/snapshots/persistence/ 301 -/references/init-hooks /aws/configuration/config/initialization-hooks/ 301 -/references/coverage/coverage_support /aws/services/support 301 +/references/init-hooks /aws/customization/advanced/initialization-hooks/ 301 +/references/coverage/coverage_support /aws/services/support/ 301 /user-guide /aws/ 301 -/user-guide/aws/qldb /aws/services/qldb 301 -/tutorials/simulating-outages /aws/tutorials/simulating-outages 301 -/user-guide/aws/acm /aws/services/acm 301 -/user-guide/integrations/sdks/php /aws/connecting/aws-sdks/net/php 301 -/references/coverage/coverage_sns /aws/services/sns 301 -/getting-started/help-and-support /aws/getting-started/help-support 301 -/user-guide/aws/amplify /aws/services/amplify 301 -/references/coverage/coverage_lakeformation /aws/services/lakeformation 301 -/user-guide/integrations/sdks/dotnet /aws/connecting/aws-sdks/net/dotnet 301 +/user-guide/aws/qldb /aws/services/qldb/ 301 +/tutorials/simulating-outages /aws/tutorials/simulating-outages/ 301 +/user-guide/aws/acm /aws/services/acm/ 301 +/user-guide/integrations/sdks/php /aws/connecting/aws-sdks/net/php/ 301 +/references/coverage/coverage_sns /aws/services/sns/ 301 +/getting-started/help-and-support /aws/getting-started/help-support/ 301 +/user-guide/aws/amplify /aws/services/amplify/ 301 +/references/coverage/coverage_lakeformation /aws/services/lakeformation/ 301 +/user-guide/integrations/sdks/dotnet /aws/connecting/aws-sdks/net/dotnet/ 301 /academy https://www.youtube.com/playlist?list=PLTew28KOwGxPqbkFiW518eeIfiV495bm0 301 -/references/coverage/coverage_cloudwatch /aws/services/cloudwatch 301 -/user-guide/aws/ecr /aws/services/ecr 301 -/user-guide/aws/stepfunctions /aws/services/stepfunctions 301 -/references/coverage/coverage_elasticache /aws/services/elasticache 301 +/references/coverage/coverage_cloudwatch /aws/services/cloudwatch/ 301 +/user-guide/aws/ecr /aws/services/ecr/ 301 +/user-guide/aws/stepfunctions /aws/services/stepfunctions/ 301 +/references/coverage/coverage_elasticache /aws/services/elasticache/ 301 /applications/mnist-handwritten-digit-recognition-model-running-on-a-local-sagemaker-endpoint https://github.com/localstack-samples/sample-mnist-digit-recognition-sagemaker 301 -/user-guide/state-management/pods-cli /aws/developer-tools/snapshots/cli-commands 301 -/user-guide/aws/dynamodbstreams /aws/services/dynamodbstreams 301 -/references/api-key /aws/getting-started/auth-token/#how-do-i-activate-older-versions-of-localstack-before-v30 301 -/references/coverage/coverage_eks /aws/services/eks 301 -/references/coverage/coverage_cognito-idp /aws/services/cognito-idp 301 -/user-guide/web-application/workspace /aws/configuration/web-app/workspace 301 -/references/coverage/coverage_cloudcontrol /aws/services/cloudcontrol 301 -/tutorials/replicate-aws-resources-localstack-extension /aws/tutorials/replicate-aws-resources-localstack-extension 301 -/user-guide/tools/localstack-sdk/python /aws/configuration/localstack-sdks/python 301 -/user-guide/lambda-tools/hot-reloading /aws/developer-tools/lambda-tools/hot-reloading 301 -/getting-started/quickstart /aws/getting-started/quickstart 301 -/overview /aws 301 -/user-guide/aws/glue /aws/services/glue 301 -/getting-started /aws/getting-started 301 -/user-guide/extensions/managing-extensions /aws/configuration/extensions/managing-extensions 301 -/references/filesystem /aws/configuration/config/filesystem/ 301 -/references /aws/configuration/config/ 301 +/user-guide/state-management/pods-cli /aws/developer-tools/snapshots/cli-commands/ 301 +/user-guide/aws/dynamodbstreams /aws/services/dynamodbstreams/ 301 +/references/api-key /aws/getting-started/auth-token/#how-do-i-activate-older-versions-of-localstack-before-v30/ 301 +/references/coverage/coverage_eks /aws/services/eks/ 301 +/references/coverage/coverage_cognito-idp /aws/services/cognito-idp/ 301 +/user-guide/web-application/workspace /aws/organizations-admin/workspaces/ 301 +/references/coverage/coverage_cloudcontrol /aws/services/cloudcontrol/ 301 +/tutorials/replicate-aws-resources-localstack-extension /aws/tutorials/replicate-aws-resources-localstack-extension/ 301 +/user-guide/tools/localstack-sdk/python /aws/customization/integrations/localstack-sdks/python-sdk/ 301 +/user-guide/lambda-tools/hot-reloading /aws/developer-tools/lambda-tools/hot-reloading/ 301 +/getting-started/quickstart /aws/getting-started/quickstart/ 301 +/overview /aws/ 301 +/user-guide/aws/glue /aws/services/glue/ 301 +/getting-started /aws/getting-started/ 301 +/user-guide/extensions/managing-extensions /aws/customization/integrations/extensions/managing-extensions/ 301 +/references/filesystem /aws/customization/advanced/filesystem/ 301 +/references /aws/customization/ 301 /academy/localstack-101/getting-started https://www.youtube.com/watch?v=CzX4mfiS058&feature=youtu.be 301 /user-guide/materalized-views /snowflake/features/materialized-views/ 301 /user-guide/materalized-views/ /snowflake/features/materialized-views/ 301 /snowflake/features/materalized-views/ /snowflake/features/materialized-views/ 301 -/user-guide/ci /aws/integrations/continuous-integration/ 301 -/user-guide/ci/ /aws/integrations/continuous-integration/ 301 -/aws/user-guide/ci /aws/integrations/continuous-integration/ 301 -/aws/user-guide/ci/ /aws/integrations/continuous-integration/ 301 +/user-guide/ci /aws/ci-pipelines/ 301 +/user-guide/ci/ /aws/ci-pipelines/ 301 +/aws/user-guide/ci /aws/ci-pipelines/ 301 +/aws/user-guide/ci/ /aws/ci-pipelines/ 301 /aws/tooling/lambda-tools/vscode-extension/ /aws/connecting/ides/vscode-extension/ 301 /aws/tooling/lambda-tools/vscode-extension /aws/connecting/ides/vscode-extension/ 301 /aws/capabilities/cloud-sandbox/application-previews/ /aws/developer-tools/cloud-sandbox/app-preview/ 301 @@ -875,159 +875,273 @@ /aws/integrations/aws-native-tools /aws/connecting/ 301 /aws/integrations/infrastructure-as-code/ /aws/connecting/infrastructure-as-code/ 301 /aws/integrations/infrastructure-as-code /aws/connecting/infrastructure-as-code/ 301 -/aws/capabilities/state-management/cli-commands /aws/developer-tools/snapshots/cli-commands 301 -/aws/capabilities/state-management/cli-commands/ /aws/developer-tools/snapshots/cli-commands 301 -/aws/capabilities/state-management/export-import-state /aws/developer-tools/snapshots/export-import-state 301 -/aws/capabilities/state-management/export-import-state/ /aws/developer-tools/snapshots/export-import-state 301 +/aws/capabilities/state-management/cli-commands /aws/developer-tools/snapshots/cli-commands/ 301 +/aws/capabilities/state-management/cli-commands/ /aws/developer-tools/snapshots/cli-commands/ 301 +/aws/capabilities/state-management/export-import-state /aws/developer-tools/snapshots/export-import-state/ 301 +/aws/capabilities/state-management/export-import-state/ /aws/developer-tools/snapshots/export-import-state/ 301 /aws/capabilities/state-management/ /aws/developer-tools/snapshots/ 301 -/aws/capabilities/state-management/launchpad /aws/developer-tools/snapshots/launchpad 301 -/aws/capabilities/state-management/launchpad/ /aws/developer-tools/snapshots/launchpad 301 -/aws/capabilities/state-management/cloud-pods /aws/developer-tools/snapshots/cloud-pods 301 -/aws/capabilities/state-management/cloud-pods/ /aws/developer-tools/snapshots/cloud-pods 301 -/aws/capabilities/state-management/persistence /aws/developer-tools/snapshots/persistence 301 -/aws/capabilities/state-management/persistence/ /aws/developer-tools/snapshots/persistence 301 -/aws/capabilities/cloud-sandbox/app-preview /aws/developer-tools/cloud-sandbox/app-preview 301 -/aws/capabilities/cloud-sandbox/app-preview/ /aws/developer-tools/cloud-sandbox/app-preview 301 -/aws/capabilities/cloud-sandbox/ephemeral-instances /aws/developer-tools/cloud-sandbox/ephemeral-instances 301 -/aws/capabilities/cloud-sandbox/ephemeral-instances/ /aws/developer-tools/cloud-sandbox/ephemeral-instances 301 +/aws/capabilities/state-management/launchpad /aws/developer-tools/snapshots/launchpad/ 301 +/aws/capabilities/state-management/launchpad/ /aws/developer-tools/snapshots/launchpad/ 301 +/aws/capabilities/state-management/cloud-pods /aws/developer-tools/snapshots/cloud-pods/ 301 +/aws/capabilities/state-management/cloud-pods/ /aws/developer-tools/snapshots/cloud-pods/ 301 +/aws/capabilities/state-management/persistence /aws/developer-tools/snapshots/persistence/ 301 +/aws/capabilities/state-management/persistence/ /aws/developer-tools/snapshots/persistence/ 301 +/aws/capabilities/cloud-sandbox/app-preview /aws/developer-tools/cloud-sandbox/app-preview/ 301 +/aws/capabilities/cloud-sandbox/app-preview/ /aws/developer-tools/cloud-sandbox/app-preview/ 301 +/aws/capabilities/cloud-sandbox/ephemeral-instances /aws/developer-tools/cloud-sandbox/ephemeral-instances/ 301 +/aws/capabilities/cloud-sandbox/ephemeral-instances/ /aws/developer-tools/cloud-sandbox/ephemeral-instances/ 301 /aws/capabilities/cloud-sandbox/ /aws/developer-tools/cloud-sandbox/ 301 -/aws/capabilities/chaos-engineering/aws-fault-injection /aws/developer-tools/chaos-engineering/aws-fault-injection 301 -/aws/capabilities/chaos-engineering/aws-fault-injection/ /aws/developer-tools/chaos-engineering/aws-fault-injection 301 -/aws/capabilities/chaos-engineering/chaos-api /aws/developer-tools/chaos-engineering/chaos-api 301 -/aws/capabilities/chaos-engineering/chaos-api/ /aws/developer-tools/chaos-engineering/chaos-api 301 -/aws/capabilities/chaos-engineering/chaos-engineering-dashboard /aws/developer-tools/chaos-engineering/chaos-engineering-dashboard 301 -/aws/capabilities/chaos-engineering/chaos-engineering-dashboard/ /aws/developer-tools/chaos-engineering/chaos-engineering-dashboard 301 +/aws/capabilities/chaos-engineering/aws-fault-injection /aws/developer-tools/chaos-engineering/aws-fault-injection/ 301 +/aws/capabilities/chaos-engineering/aws-fault-injection/ /aws/developer-tools/chaos-engineering/aws-fault-injection/ 301 +/aws/capabilities/chaos-engineering/chaos-api /aws/developer-tools/chaos-engineering/chaos-api/ 301 +/aws/capabilities/chaos-engineering/chaos-api/ /aws/developer-tools/chaos-engineering/chaos-api/ 301 +/aws/capabilities/chaos-engineering/chaos-engineering-dashboard /aws/developer-tools/chaos-engineering/chaos-engineering-dashboard/ 301 +/aws/capabilities/chaos-engineering/chaos-engineering-dashboard/ /aws/developer-tools/chaos-engineering/chaos-engineering-dashboard/ 301 /aws/capabilities/chaos-engineering/ /aws/developer-tools/chaos-engineering/ 301 -/aws/capabilities/security-testing/explainable-iam /aws/developer-tools/security-testing/explainable-iam 301 -/aws/capabilities/security-testing/explainable-iam/ /aws/developer-tools/security-testing/explainable-iam 301 -/aws/capabilities/security-testing/iam-coverage /aws/developer-tools/security-testing/iam-coverage 301 -/aws/capabilities/security-testing/iam-coverage/ /aws/developer-tools/security-testing/iam-coverage 301 -/aws/capabilities/security-testing/iam-policy-enforcement /aws/developer-tools/security-testing/iam-policy-enforcement 301 -/aws/capabilities/security-testing/iam-policy-enforcement/ /aws/developer-tools/security-testing/iam-policy-enforcement 301 -/aws/capabilities/security-testing/iam-policy-stream /aws/developer-tools/security-testing/iam-policy-stream 301 -/aws/capabilities/security-testing/iam-policy-stream/ /aws/developer-tools/security-testing/iam-policy-stream 301 +/aws/capabilities/security-testing/explainable-iam /aws/developer-tools/security-testing/explainable-iam/ 301 +/aws/capabilities/security-testing/explainable-iam/ /aws/developer-tools/security-testing/explainable-iam/ 301 +/aws/capabilities/security-testing/iam-coverage /aws/developer-tools/security-testing/iam-coverage/ 301 +/aws/capabilities/security-testing/iam-coverage/ /aws/developer-tools/security-testing/iam-coverage/ 301 +/aws/capabilities/security-testing/iam-policy-enforcement /aws/developer-tools/security-testing/iam-policy-enforcement/ 301 +/aws/capabilities/security-testing/iam-policy-enforcement/ /aws/developer-tools/security-testing/iam-policy-enforcement/ 301 +/aws/capabilities/security-testing/iam-policy-stream /aws/developer-tools/security-testing/iam-policy-stream/ 301 +/aws/capabilities/security-testing/iam-policy-stream/ /aws/developer-tools/security-testing/iam-policy-stream/ 301 /aws/capabilities/security-testing/ /aws/developer-tools/security-testing/ 301 -/aws/capabilities/security-testing/custom-tls-certificates /aws/developer-tools/security-testing/custom-tls-certificates 301 -/aws/capabilities/security-testing/custom-tls-certificates/ /aws/developer-tools/security-testing/custom-tls-certificates 301 +/aws/capabilities/security-testing/custom-tls-certificates /aws/developer-tools/security-testing/custom-tls-certificates/ 301 +/aws/capabilities/security-testing/custom-tls-certificates/ /aws/developer-tools/security-testing/custom-tls-certificates/ 301 /aws/tooling/lambda-tools/ /aws/developer-tools/lambda-tools/ 301 -/aws/tooling/lambda-tools/hot-reloading /aws/developer-tools/lambda-tools/hot-reloading 301 -/aws/tooling/lambda-tools/hot-reloading/ /aws/developer-tools/lambda-tools/hot-reloading 301 -/aws/tooling/lambda-tools/remote-debugging /aws/developer-tools/lambda-tools/remote-debugging 301 -/aws/tooling/lambda-tools/remote-debugging/ /aws/developer-tools/lambda-tools/remote-debugging 301 -/aws/tooling/localstack-sdks/ /aws/configuration/localstack-sdks/ 301 -/aws/tooling/localstack-sdks/java-sdk /aws/configuration/localstack-sdks/java-sdk 301 -/aws/tooling/localstack-sdks/java-sdk/ /aws/configuration/localstack-sdks/java-sdk 301 -/aws/tooling/localstack-sdks/python-sdk /aws/configuration/localstack-sdks/python-sdk 301 -/aws/tooling/localstack-sdks/python-sdk/ /aws/configuration/localstack-sdks/python-sdk 301 -/aws/tooling/extensions/extensions-library /aws/configuration/extensions/extensions-library 301 -/aws/tooling/extensions/extensions-library/ /aws/configuration/extensions/extensions-library 301 -/aws/tooling/extensions/ /aws/configuration/extensions/ 301 -/aws/tooling/extensions/mailhog /aws/configuration/extensions/mailhog 301 -/aws/tooling/extensions/mailhog/ /aws/configuration/extensions/mailhog 301 -/aws/tooling/extensions/developing-extensions /aws/configuration/extensions/developing-extensions 301 -/aws/tooling/extensions/developing-extensions/ /aws/configuration/extensions/developing-extensions 301 -/aws/tooling/extensions/managing-extensions /aws/configuration/extensions/managing-extensions 301 -/aws/tooling/extensions/managing-extensions/ /aws/configuration/extensions/managing-extensions 301 -/aws/capabilities/web-app/app-inspector /aws/developer-tools/app-inspector 301 -/aws/capabilities/web-app/app-inspector/ /aws/developer-tools/app-inspector 301 -/aws/tooling/aws-replicator /aws/developer-tools/aws-replicator 301 -/aws/tooling/aws-replicator/ /aws/developer-tools/aws-replicator 301 -/aws/tooling/localstack-cli /aws/developer-tools/running-localstack/localstack-cli 301 -/aws/tooling/localstack-cli/ /aws/developer-tools/running-localstack/localstack-cli 301 -/aws/tooling/lstk /aws/developer-tools/running-localstack/lstk 301 -/aws/tooling/lstk/ /aws/developer-tools/running-localstack/lstk 301 -/aws/tooling/mcp-server /aws/developer-tools/running-localstack/mcp-server 301 -/aws/tooling/mcp-server/ /aws/developer-tools/running-localstack/mcp-server 301 -/aws/tooling/dns-server /aws/configuration/dns-server 301 -/aws/tooling/dns-server/ /aws/configuration/dns-server 301 -/aws/tooling/testing-utils /aws/configuration/testing-utils 301 -/aws/tooling/testing-utils/ /aws/configuration/testing-utils 301 -/aws/tooling/localstack-docker-extension /aws/configuration/localstack-docker-extension 301 -/aws/tooling/localstack-docker-extension/ /aws/configuration/localstack-docker-extension 301 -/aws/tooling/localsurf /aws/configuration/localsurf 301 -/aws/tooling/localsurf/ /aws/configuration/localsurf 301 -/aws/tooling /aws/developer-tools 301 +/aws/tooling/lambda-tools/hot-reloading /aws/developer-tools/lambda-tools/hot-reloading/ 301 +/aws/tooling/lambda-tools/hot-reloading/ /aws/developer-tools/lambda-tools/hot-reloading/ 301 +/aws/tooling/lambda-tools/remote-debugging /aws/developer-tools/lambda-tools/remote-debugging/ 301 +/aws/tooling/lambda-tools/remote-debugging/ /aws/developer-tools/lambda-tools/remote-debugging/ 301 +/aws/tooling/localstack-sdks/ /aws/customization/integrations/localstack-sdks/ 301 +/aws/tooling/localstack-sdks/java-sdk /aws/customization/integrations/localstack-sdks/java-sdk/ 301 +/aws/tooling/localstack-sdks/java-sdk/ /aws/customization/integrations/localstack-sdks/java-sdk/ 301 +/aws/tooling/localstack-sdks/python-sdk /aws/customization/integrations/localstack-sdks/python-sdk/ 301 +/aws/tooling/localstack-sdks/python-sdk/ /aws/customization/integrations/localstack-sdks/python-sdk/ 301 +/aws/tooling/extensions/extensions-library /aws/customization/integrations/extensions/extensions-library/ 301 +/aws/tooling/extensions/extensions-library/ /aws/customization/integrations/extensions/extensions-library/ 301 +/aws/tooling/extensions/ /aws/customization/integrations/extensions/ 301 +/aws/tooling/extensions/mailhog /aws/customization/integrations/extensions/mailhog/ 301 +/aws/tooling/extensions/mailhog/ /aws/customization/integrations/extensions/mailhog/ 301 +/aws/tooling/extensions/developing-extensions /aws/customization/integrations/extensions/developing-extensions/ 301 +/aws/tooling/extensions/developing-extensions/ /aws/customization/integrations/extensions/developing-extensions/ 301 +/aws/tooling/extensions/managing-extensions /aws/customization/integrations/extensions/managing-extensions/ 301 +/aws/tooling/extensions/managing-extensions/ /aws/customization/integrations/extensions/managing-extensions/ 301 +/aws/capabilities/web-app/app-inspector /aws/developer-tools/app-inspector/ 301 +/aws/capabilities/web-app/app-inspector/ /aws/developer-tools/app-inspector/ 301 +/aws/tooling/aws-replicator /aws/developer-tools/aws-replicator/ 301 +/aws/tooling/aws-replicator/ /aws/developer-tools/aws-replicator/ 301 +/aws/tooling/localstack-cli /aws/developer-tools/running-localstack/localstack-cli/ 301 +/aws/tooling/localstack-cli/ /aws/developer-tools/running-localstack/localstack-cli/ 301 +/aws/tooling/lstk /aws/developer-tools/running-localstack/lstk/ 301 +/aws/tooling/lstk/ /aws/developer-tools/running-localstack/lstk/ 301 +/aws/tooling/mcp-server /aws/developer-tools/running-localstack/mcp-server/ 301 +/aws/tooling/mcp-server/ /aws/developer-tools/running-localstack/mcp-server/ 301 +/aws/tooling/dns-server /aws/customization/networking/dns-server/ 301 +/aws/tooling/dns-server/ /aws/customization/networking/dns-server/ 301 +/aws/tooling/testing-utils /aws/customization/integrations/localstack-sdks/testing-utils/ 301 +/aws/tooling/testing-utils/ /aws/customization/integrations/localstack-sdks/testing-utils/ 301 +/aws/tooling/localstack-docker-extension /aws/customization/other-installations/localstack-docker-extension/ 301 +/aws/tooling/localstack-docker-extension/ /aws/customization/other-installations/localstack-docker-extension/ 301 +/aws/tooling/localsurf /aws/customization/networking/localsurf/ 301 +/aws/tooling/localsurf/ /aws/customization/networking/localsurf/ 301 +/aws/tooling /aws/developer-tools/ 301 /aws/tooling/ /aws/developer-tools/ 301 -/aws/capabilities /aws/configuration 301 -/aws/capabilities/ /aws/configuration 301 -/aws/capabilities/config /aws/configuration/config 301 -/aws/capabilities/config/ /aws/configuration/config 301 -/aws/capabilities/config/arm64-support /aws/configuration/config/arm64-support 301 -/aws/capabilities/config/arm64-support/ /aws/configuration/config/arm64-support 301 -/aws/capabilities/config/configuration /aws/configuration/config/configuration 301 -/aws/capabilities/config/configuration/ /aws/configuration/config/configuration 301 -/aws/capabilities/config/credentials /aws/configuration/config/credentials 301 -/aws/capabilities/config/credentials/ /aws/configuration/config/credentials 301 -/aws/capabilities/config/cross-account-access /aws/configuration/config/cross-account-access 301 -/aws/capabilities/config/cross-account-access/ /aws/configuration/config/cross-account-access 301 -/aws/capabilities/config/docker-images /aws/configuration/config/docker-images 301 -/aws/capabilities/config/docker-images/ /aws/configuration/config/docker-images 301 -/aws/capabilities/config/filesystem /aws/configuration/config/filesystem 301 -/aws/capabilities/config/filesystem/ /aws/configuration/config/filesystem 301 -/aws/capabilities/config/initialization-hooks /aws/configuration/config/initialization-hooks 301 -/aws/capabilities/config/initialization-hooks/ /aws/configuration/config/initialization-hooks 301 -/aws/capabilities/config/internal-endpoints /aws/configuration/config/internal-endpoints 301 -/aws/capabilities/config/internal-endpoints/ /aws/configuration/config/internal-endpoints 301 -/aws/capabilities/config/logging /aws/configuration/config/logging 301 -/aws/capabilities/config/logging/ /aws/configuration/config/logging 301 -/aws/capabilities/config/multi-account-setups /aws/configuration/config/multi-account-setups 301 -/aws/capabilities/config/multi-account-setups/ /aws/configuration/config/multi-account-setups 301 -/aws/capabilities/config/podman /aws/configuration/config/podman 301 -/aws/capabilities/config/podman/ /aws/configuration/config/podman 301 -/aws/capabilities/config/regions-coverage /aws/configuration/config/regions-coverage 301 -/aws/capabilities/config/regions-coverage/ /aws/configuration/config/regions-coverage 301 -/aws/capabilities/config/usage-tracking /aws/configuration/config/usage-tracking 301 -/aws/capabilities/config/usage-tracking/ /aws/configuration/config/usage-tracking 301 -/aws/capabilities/dns-server /aws/configuration/dns-server 301 -/aws/capabilities/dns-server/ /aws/configuration/dns-server 301 -/aws/capabilities/extensions /aws/configuration/extensions 301 -/aws/capabilities/extensions/ /aws/configuration/extensions 301 -/aws/capabilities/extensions/developing-extensions /aws/configuration/extensions/developing-extensions 301 -/aws/capabilities/extensions/developing-extensions/ /aws/configuration/extensions/developing-extensions 301 -/aws/capabilities/extensions/extensions-library /aws/configuration/extensions/extensions-library 301 -/aws/capabilities/extensions/extensions-library/ /aws/configuration/extensions/extensions-library 301 -/aws/capabilities/extensions/mailhog /aws/configuration/extensions/mailhog 301 -/aws/capabilities/extensions/mailhog/ /aws/configuration/extensions/mailhog 301 -/aws/capabilities/extensions/managing-extensions /aws/configuration/extensions/managing-extensions 301 -/aws/capabilities/extensions/managing-extensions/ /aws/configuration/extensions/managing-extensions 301 -/aws/capabilities/localstack-docker-extension /aws/configuration/localstack-docker-extension 301 -/aws/capabilities/localstack-docker-extension/ /aws/configuration/localstack-docker-extension 301 -/aws/capabilities/localstack-sdks /aws/configuration/localstack-sdks 301 -/aws/capabilities/localstack-sdks/ /aws/configuration/localstack-sdks 301 -/aws/capabilities/localstack-sdks/java-sdk /aws/configuration/localstack-sdks/java-sdk 301 -/aws/capabilities/localstack-sdks/java-sdk/ /aws/configuration/localstack-sdks/java-sdk 301 -/aws/capabilities/localstack-sdks/python-sdk /aws/configuration/localstack-sdks/python-sdk 301 -/aws/capabilities/localstack-sdks/python-sdk/ /aws/configuration/localstack-sdks/python-sdk 301 -/aws/capabilities/localsurf /aws/configuration/localsurf 301 -/aws/capabilities/localsurf/ /aws/configuration/localsurf 301 -/aws/capabilities/networking /aws/configuration/networking 301 -/aws/capabilities/networking/ /aws/configuration/networking 301 -/aws/capabilities/networking/accessing-endpoint-url /aws/configuration/networking/accessing-endpoint-url 301 -/aws/capabilities/networking/accessing-endpoint-url/ /aws/configuration/networking/accessing-endpoint-url 301 -/aws/capabilities/networking/accessing-resources-created /aws/configuration/networking/accessing-resources-created 301 -/aws/capabilities/networking/accessing-resources-created/ /aws/configuration/networking/accessing-resources-created 301 -/aws/capabilities/networking/external-port-range /aws/configuration/networking/external-port-range 301 -/aws/capabilities/networking/external-port-range/ /aws/configuration/networking/external-port-range 301 -/aws/capabilities/networking/https-tls-support /aws/configuration/networking/https-tls-support 301 -/aws/capabilities/networking/https-tls-support/ /aws/configuration/networking/https-tls-support 301 -/aws/capabilities/networking/internal-endpoints /aws/configuration/networking/internal-endpoints 301 -/aws/capabilities/networking/internal-endpoints/ /aws/configuration/networking/internal-endpoints 301 -/aws/capabilities/networking/transparent-endpoint-injection /aws/configuration/networking/transparent-endpoint-injection 301 -/aws/capabilities/networking/transparent-endpoint-injection/ /aws/configuration/networking/transparent-endpoint-injection 301 -/aws/capabilities/testing-utils /aws/configuration/testing-utils 301 -/aws/capabilities/testing-utils/ /aws/configuration/testing-utils 301 -/aws/capabilities/web-app /aws/configuration/web-app 301 -/aws/capabilities/web-app/ /aws/configuration/web-app 301 -/aws/capabilities/web-app/accounts /aws/configuration/web-app/accounts 301 -/aws/capabilities/web-app/accounts/ /aws/configuration/web-app/accounts 301 -/aws/capabilities/web-app/instance-management /aws/configuration/web-app/instance-management 301 -/aws/capabilities/web-app/instance-management/ /aws/configuration/web-app/instance-management 301 -/aws/capabilities/web-app/localstack-desktop /aws/configuration/web-app/localstack-desktop 301 -/aws/capabilities/web-app/localstack-desktop/ /aws/configuration/web-app/localstack-desktop 301 -/aws/capabilities/web-app/managing-users-licenses /aws/configuration/web-app/managing-users-licenses 301 -/aws/capabilities/web-app/managing-users-licenses/ /aws/configuration/web-app/managing-users-licenses 301 -/aws/capabilities/web-app/stack-insights /aws/configuration/web-app/stack-insights 301 -/aws/capabilities/web-app/stack-insights/ /aws/configuration/web-app/stack-insights 301 -/aws/capabilities/web-app/workspaces /aws/configuration/web-app/workspaces 301 -/aws/capabilities/web-app/workspaces/ /aws/configuration/web-app/workspaces 301 +/aws/capabilities /aws/customization/ 301 +/aws/capabilities/ /aws/customization/ 301 +/aws/capabilities/config /aws/customization/ 301 +/aws/capabilities/config/ /aws/customization/ 301 +/aws/capabilities/config/arm64-support /aws/customization/advanced/arm64-support/ 301 +/aws/capabilities/config/arm64-support/ /aws/customization/advanced/arm64-support/ 301 +/aws/capabilities/config/configuration /aws/customization/configuration-options/ 301 +/aws/capabilities/config/configuration/ /aws/customization/configuration-options/ 301 +/aws/capabilities/config/credentials /aws/connecting/credentials/ 301 +/aws/capabilities/config/credentials/ /aws/connecting/credentials/ 301 +/aws/capabilities/config/cross-account-access /aws/customization/advanced/cross-account-access/ 301 +/aws/capabilities/config/cross-account-access/ /aws/customization/advanced/cross-account-access/ 301 +/aws/capabilities/config/docker-images /aws/customization/other-installations/docker-images/ 301 +/aws/capabilities/config/docker-images/ /aws/customization/other-installations/docker-images/ 301 +/aws/capabilities/config/filesystem /aws/customization/advanced/filesystem/ 301 +/aws/capabilities/config/filesystem/ /aws/customization/advanced/filesystem/ 301 +/aws/capabilities/config/initialization-hooks /aws/customization/advanced/initialization-hooks/ 301 +/aws/capabilities/config/initialization-hooks/ /aws/customization/advanced/initialization-hooks/ 301 +/aws/capabilities/config/internal-endpoints /aws/customization/networking/internal-endpoints/ 301 +/aws/capabilities/config/internal-endpoints/ /aws/customization/networking/internal-endpoints/ 301 +/aws/capabilities/config/logging /aws/customization/logging/ 301 +/aws/capabilities/config/logging/ /aws/customization/logging/ 301 +/aws/capabilities/config/multi-account-setups /aws/customization/advanced/multi-account-setups/ 301 +/aws/capabilities/config/multi-account-setups/ /aws/customization/advanced/multi-account-setups/ 301 +/aws/capabilities/config/podman /aws/customization/other-installations/podman/ 301 +/aws/capabilities/config/podman/ /aws/customization/other-installations/podman/ 301 +/aws/capabilities/config/regions-coverage /aws/customization/advanced/regions-coverage/ 301 +/aws/capabilities/config/regions-coverage/ /aws/customization/advanced/regions-coverage/ 301 +/aws/capabilities/config/usage-tracking /aws/customization/advanced/usage-tracking/ 301 +/aws/capabilities/config/usage-tracking/ /aws/customization/advanced/usage-tracking/ 301 +/aws/capabilities/dns-server /aws/customization/networking/dns-server/ 301 +/aws/capabilities/dns-server/ /aws/customization/networking/dns-server/ 301 +/aws/capabilities/extensions /aws/customization/integrations/extensions/ 301 +/aws/capabilities/extensions/ /aws/customization/integrations/extensions/ 301 +/aws/capabilities/localstack-docker-extension /aws/customization/other-installations/localstack-docker-extension/ 301 +/aws/capabilities/localstack-docker-extension/ /aws/customization/other-installations/localstack-docker-extension/ 301 +/aws/capabilities/localstack-sdks /aws/customization/integrations/localstack-sdks/ 301 +/aws/capabilities/localstack-sdks/ /aws/customization/integrations/localstack-sdks/ 301 +/aws/capabilities/localsurf /aws/customization/networking/localsurf/ 301 +/aws/capabilities/localsurf/ /aws/customization/networking/localsurf/ 301 +/aws/capabilities/networking /aws/customization/networking/ 301 +/aws/capabilities/networking/ /aws/customization/networking/ 301 +/aws/capabilities/testing-utils /aws/customization/integrations/localstack-sdks/testing-utils/ 301 +/aws/capabilities/testing-utils/ /aws/customization/integrations/localstack-sdks/testing-utils/ 301 +/aws/capabilities/web-app /aws/organizations-admin/ 301 +/aws/capabilities/web-app/ /aws/organizations-admin/ 301 +/aws/capabilities/web-app/accounts /aws/organizations-admin/accounts/ 301 +/aws/capabilities/web-app/accounts/ /aws/organizations-admin/accounts/ 301 +/aws/capabilities/web-app/instance-management /aws/connecting/console/instance-management/ 301 +/aws/capabilities/web-app/instance-management/ /aws/connecting/console/instance-management/ 301 +/aws/capabilities/web-app/localstack-desktop /aws/developer-tools/running-localstack/localstack-desktop/ 301 +/aws/capabilities/web-app/localstack-desktop/ /aws/developer-tools/running-localstack/localstack-desktop/ 301 +/aws/capabilities/web-app/managing-users-licenses /aws/organizations-admin/managing-users-licenses/ 301 +/aws/capabilities/web-app/managing-users-licenses/ /aws/organizations-admin/managing-users-licenses/ 301 +/aws/capabilities/web-app/stack-insights /aws/organizations-admin/stack-insights/ 301 +/aws/capabilities/web-app/stack-insights/ /aws/organizations-admin/stack-insights/ 301 +/aws/capabilities/web-app/workspaces /aws/organizations-admin/workspaces/ 301 +/aws/capabilities/web-app/workspaces/ /aws/organizations-admin/workspaces/ 301 + +/aws/configuration/networking/* /aws/customization/networking/:splat 301 +/aws/configuration/networking /aws/customization/networking/ 301 +/aws/configuration/config/configuration /aws/customization/configuration-options/ 301 +/aws/configuration/config/logging /aws/customization/logging/ 301 +/aws/configuration/config/arm64-support /aws/customization/advanced/arm64-support/ 301 +/aws/configuration/config/cross-account-access /aws/customization/advanced/cross-account-access/ 301 +/aws/configuration/config/multi-account-setups /aws/customization/advanced/multi-account-setups/ 301 +/aws/configuration/config/filesystem /aws/customization/advanced/filesystem/ 301 +/aws/configuration/config/initialization-hooks /aws/customization/advanced/initialization-hooks/ 301 +/aws/configuration/config/regions-coverage /aws/customization/advanced/regions-coverage/ 301 +/aws/configuration/config/usage-tracking /aws/customization/advanced/usage-tracking/ 301 +/aws/configuration/config/internal-endpoints /aws/customization/networking/internal-endpoints/ 301 +/aws/configuration/config/credentials /aws/connecting/credentials/ 301 +/aws/configuration/config/docker-images /aws/customization/other-installations/docker-images/ 301 +/aws/configuration/config/podman /aws/customization/other-installations/podman/ 301 +/aws/configuration/config /aws/customization/ 301 +/aws/configuration/dns-server /aws/customization/networking/dns-server/ 301 +/aws/configuration/localsurf /aws/customization/networking/localsurf/ 301 +/aws/configuration/testing-utils /aws/customization/integrations/localstack-sdks/testing-utils/ 301 +/aws/configuration/localstack-docker-extension /aws/customization/other-installations/localstack-docker-extension/ 301 +/aws/configuration/localstack-sdks/* /aws/customization/integrations/localstack-sdks/:splat 301 +/aws/configuration/localstack-sdks /aws/customization/integrations/localstack-sdks/ 301 +/aws/configuration/extensions/* /aws/customization/integrations/extensions/:splat 301 +/aws/configuration/extensions /aws/customization/integrations/extensions/ 301 +/aws/configuration/web-app/accounts /aws/organizations-admin/accounts/ 301 +/aws/configuration/web-app/workspaces /aws/organizations-admin/workspaces/ 301 +/aws/configuration/web-app/managing-users-licenses /aws/organizations-admin/managing-users-licenses/ 301 +/aws/configuration/web-app/stack-insights /aws/organizations-admin/stack-insights/ 301 +/aws/configuration/web-app/instance-management /aws/connecting/console/instance-management/ 301 +/aws/configuration/web-app/localstack-desktop /aws/developer-tools/running-localstack/localstack-desktop/ 301 +/aws/configuration/web-app /aws/organizations-admin/ 301 +/aws/configuration /aws/customization/ 301 +/aws/configuration/ /aws/customization/ 301 +/aws/configuration/chaos-engineering/ /aws/developer-tools/chaos-engineering/ 301 +/aws/configuration/chaos-engineering/aws-fault-injection /aws/developer-tools/chaos-engineering/aws-fault-injection/ 301 +/aws/configuration/chaos-engineering/aws-fault-injection/ /aws/developer-tools/chaos-engineering/aws-fault-injection/ 301 +/aws/configuration/chaos-engineering/chaos-api /aws/developer-tools/chaos-engineering/chaos-api/ 301 +/aws/configuration/chaos-engineering/chaos-api/ /aws/developer-tools/chaos-engineering/chaos-api/ 301 +/aws/configuration/chaos-engineering/chaos-engineering-dashboard /aws/developer-tools/chaos-engineering/chaos-engineering-dashboard/ 301 +/aws/configuration/chaos-engineering/chaos-engineering-dashboard/ /aws/developer-tools/chaos-engineering/chaos-engineering-dashboard/ 301 +/aws/configuration/cloud-sandbox/ /aws/developer-tools/cloud-sandbox/ 301 +/aws/configuration/cloud-sandbox/app-preview /aws/developer-tools/cloud-sandbox/app-preview/ 301 +/aws/configuration/cloud-sandbox/app-preview/ /aws/developer-tools/cloud-sandbox/app-preview/ 301 +/aws/configuration/cloud-sandbox/application-previews /aws/developer-tools/cloud-sandbox/app-preview/ 301 +/aws/configuration/cloud-sandbox/application-previews/ /aws/developer-tools/cloud-sandbox/app-preview/ 301 +/aws/configuration/cloud-sandbox/ephemeral-instances /aws/developer-tools/cloud-sandbox/ephemeral-instances/ 301 +/aws/configuration/cloud-sandbox/ephemeral-instances/ /aws/developer-tools/cloud-sandbox/ephemeral-instances/ 301 +/aws/configuration/config/ /aws/customization/ 301 +/aws/configuration/config/arm64-support/ /aws/customization/advanced/arm64-support/ 301 +/aws/configuration/config/configuration/ /aws/customization/configuration-options/ 301 +/aws/configuration/config/credentials/ /aws/connecting/credentials/ 301 +/aws/configuration/config/cross-account-access/ /aws/customization/advanced/cross-account-access/ 301 +/aws/configuration/config/docker-images/ /aws/customization/other-installations/docker-images/ 301 +/aws/configuration/config/filesystem/ /aws/customization/advanced/filesystem/ 301 +/aws/configuration/config/initialization-hooks/ /aws/customization/advanced/initialization-hooks/ 301 +/aws/configuration/config/internal-endpoints/ /aws/customization/networking/internal-endpoints/ 301 +/aws/configuration/config/logging/ /aws/customization/logging/ 301 +/aws/configuration/config/multi-account-setups/ /aws/customization/advanced/multi-account-setups/ 301 +/aws/configuration/config/podman/ /aws/customization/other-installations/podman/ 301 +/aws/configuration/config/regions-coverage/ /aws/customization/advanced/regions-coverage/ 301 +/aws/configuration/config/usage-tracking/ /aws/customization/advanced/usage-tracking/ 301 +/aws/configuration/dns-server/ /aws/customization/networking/dns-server/ 301 +/aws/configuration/extensions/ /aws/customization/integrations/extensions/ 301 +/aws/configuration/localstack-docker-extension/ /aws/customization/other-installations/localstack-docker-extension/ 301 +/aws/configuration/localstack-sdks/ /aws/customization/integrations/localstack-sdks/ 301 +/aws/configuration/localsurf/ /aws/customization/networking/localsurf/ 301 +/aws/configuration/networking/ /aws/customization/networking/ 301 +/aws/configuration/security-testing/ /aws/developer-tools/security-testing/ 301 +/aws/configuration/security-testing/custom-tls-certificates /aws/developer-tools/security-testing/custom-tls-certificates/ 301 +/aws/configuration/security-testing/custom-tls-certificates/ /aws/developer-tools/security-testing/custom-tls-certificates/ 301 +/aws/configuration/security-testing/explainable-iam /aws/developer-tools/security-testing/explainable-iam/ 301 +/aws/configuration/security-testing/explainable-iam/ /aws/developer-tools/security-testing/explainable-iam/ 301 +/aws/configuration/security-testing/iam-coverage /aws/developer-tools/security-testing/iam-coverage/ 301 +/aws/configuration/security-testing/iam-coverage/ /aws/developer-tools/security-testing/iam-coverage/ 301 +/aws/configuration/security-testing/iam-policy-enforcement /aws/developer-tools/security-testing/iam-policy-enforcement/ 301 +/aws/configuration/security-testing/iam-policy-enforcement/ /aws/developer-tools/security-testing/iam-policy-enforcement/ 301 +/aws/configuration/security-testing/iam-policy-stream /aws/developer-tools/security-testing/iam-policy-stream/ 301 +/aws/configuration/security-testing/iam-policy-stream/ /aws/developer-tools/security-testing/iam-policy-stream/ 301 +/aws/configuration/state-management/ /aws/developer-tools/snapshots/ 301 +/aws/configuration/state-management/cli-commands /aws/developer-tools/snapshots/cli-commands/ 301 +/aws/configuration/state-management/cli-commands/ /aws/developer-tools/snapshots/cli-commands/ 301 +/aws/configuration/state-management/cloud-pods /aws/developer-tools/snapshots/cloud-pods/ 301 +/aws/configuration/state-management/cloud-pods/ /aws/developer-tools/snapshots/cloud-pods/ 301 +/aws/configuration/state-management/export-import-state /aws/developer-tools/snapshots/export-import-state/ 301 +/aws/configuration/state-management/export-import-state/ /aws/developer-tools/snapshots/export-import-state/ 301 +/aws/configuration/state-management/launchpad /aws/developer-tools/snapshots/launchpad/ 301 +/aws/configuration/state-management/launchpad/ /aws/developer-tools/snapshots/launchpad/ 301 +/aws/configuration/state-management/persistence /aws/developer-tools/snapshots/persistence/ 301 +/aws/configuration/state-management/persistence/ /aws/developer-tools/snapshots/persistence/ 301 +/aws/configuration/testing-utils/ /aws/customization/integrations/localstack-sdks/testing-utils/ 301 +/aws/configuration/web-app/ /aws/organizations-admin/ 301 +/aws/configuration/web-app/accounts/ /aws/organizations-admin/accounts/ 301 +/aws/configuration/web-app/app-inspector /aws/developer-tools/app-inspector/ 301 +/aws/configuration/web-app/app-inspector/ /aws/developer-tools/app-inspector/ 301 +/aws/configuration/web-app/instance-management/ /aws/connecting/console/instance-management/ 301 +/aws/configuration/web-app/localstack-desktop/ /aws/developer-tools/running-localstack/localstack-desktop/ 301 +/aws/configuration/web-app/managing-users-licenses/ /aws/organizations-admin/managing-users-licenses/ 301 +/aws/configuration/web-app/resource-browser /aws/connecting/console/resource-browser/ 301 +/aws/configuration/web-app/resource-browser/ /aws/connecting/console/resource-browser/ 301 +/aws/configuration/web-app/stack-insights/ /aws/organizations-admin/stack-insights/ 301 +/aws/configuration/web-app/stack-overview /aws/connecting/console/stack-overview/ 301 +/aws/configuration/web-app/stack-overview/ /aws/connecting/console/stack-overview/ 301 +/aws/configuration/web-app/workspaces/ /aws/organizations-admin/workspaces/ 301 + +/aws/enterprise/enterprise-image /aws/customization/other-installations/enterprise-image/ 301 +/aws/enterprise/enterprise-image/ /aws/customization/other-installations/enterprise-image/ 301 +/aws/enterprise /aws/customization/other-installations/ 301 +/aws/enterprise/ /aws/customization/other-installations/ 301 +/aws/enterprise/kubernetes /aws/customization/kubernetes/ 301 +/aws/enterprise/kubernetes/ /aws/customization/kubernetes/ 301 +/aws/enterprise/sso /aws/organizations-admin/sso/ 301 +/aws/enterprise/sso/ /aws/organizations-admin/sso/ 301 +/aws/integrations/containers/devcontainers /aws/customization/other-installations/devcontainers/ 301 +/aws/integrations/containers/devcontainers/ /aws/customization/other-installations/devcontainers/ 301 +/aws/integrations/containers/eksctl /aws/customization/kubernetes/eksctl/ 301 +/aws/integrations/containers/eksctl/ /aws/customization/kubernetes/eksctl/ 301 +/aws/integrations/containers /aws/customization/other-installations/ 301 +/aws/integrations/containers/ /aws/customization/other-installations/ 301 +/aws/integrations/containers/openshift /aws/customization/kubernetes/openshift/ 301 +/aws/integrations/containers/openshift/ /aws/customization/kubernetes/openshift/ 301 +/aws/integrations/containers/rancher-desktop /aws/customization/other-installations/rancher-desktop/ 301 +/aws/integrations/containers/rancher-desktop/ /aws/customization/other-installations/rancher-desktop/ 301 +/aws/integrations/messaging/docker-compose /aws/customization/integrations/app-frameworks/docker-compose/ 301 +/aws/integrations/messaging/docker-compose/ /aws/customization/integrations/app-frameworks/docker-compose/ 301 +/aws/integrations/messaging /aws/customization/integrations/app-frameworks/ 301 +/aws/integrations/messaging/ /aws/customization/integrations/app-frameworks/ 301 +/aws/integrations/messaging/selfmanaged-kafka-cluster /aws/customization/integrations/app-frameworks/selfmanaged-kafka-cluster/ 301 +/aws/integrations/messaging/selfmanaged-kafka-cluster/ /aws/customization/integrations/app-frameworks/selfmanaged-kafka-cluster/ 301 +/aws/integrations/continuous-integration /aws/ci-pipelines/ 301 +/aws/integrations/continuous-integration/ /aws/ci-pipelines/ 301 + +/aws/capabilities/networking/* /aws/customization/networking/:splat 301 +/aws/capabilities/extensions/* /aws/customization/integrations/extensions/:splat 301 +/aws/capabilities/localstack-sdks/* /aws/customization/integrations/localstack-sdks/:splat 301 +/aws/enterprise/kubernetes/* /aws/customization/kubernetes/:splat 301 +/aws/enterprise/sso/* /aws/organizations-admin/sso/:splat 301 +/aws/integrations/continuous-integration/* /aws/ci-pipelines/:splat 301 diff --git a/public/js/icon-loader.js b/public/js/icon-loader.js index 835a97294..e2d20a348 100644 --- a/public/js/icon-loader.js +++ b/public/js/icon-loader.js @@ -13,9 +13,11 @@ Connecting: 'plug-icon', 'Developer Tools': 'wrench-icon', Capabilities: 'starburst-icon', - Configuration: 'starburst-icon', + Customization: 'starburst-icon', Tooling: 'wrench-icon', + 'CI Pipelines': 'change-icon', Integrations: 'connections-icon', + 'Organizations & Admin': 'users-icon', Enterprise: 'buildings-icon', Tutorials: 'book-icon', Changelog: 'change-icon', @@ -40,7 +42,13 @@ const navElements = []; for (const topLevelNav of topLevelNavs) { - navElements.push(...topLevelNav.querySelectorAll('span')); + for (const span of topLevelNav.querySelectorAll('span')) { + // Only consider labels that belong directly to this top-level list, + // not labels nested inside a collapsed sub-section's own list. + if (span.closest('ul') === topLevelNav) { + navElements.push(span); + } + } } for (const element of navElements) { diff --git a/src/assets/images/CIPipelines_Color.svg b/src/assets/images/CIPipelines_Color.svg new file mode 100644 index 000000000..cf1dedf23 --- /dev/null +++ b/src/assets/images/CIPipelines_Color.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/assets/images/Connecting_Color.svg b/src/assets/images/Connecting_Color.svg new file mode 100644 index 000000000..0bfee5240 --- /dev/null +++ b/src/assets/images/Connecting_Color.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/assets/images/OrganizationsAdmin_Color.svg b/src/assets/images/OrganizationsAdmin_Color.svg new file mode 100644 index 000000000..99da59e54 --- /dev/null +++ b/src/assets/images/OrganizationsAdmin_Color.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/assets/images/Tutorials_Color.svg b/src/assets/images/Tutorials_Color.svg new file mode 100644 index 000000000..37105ba61 --- /dev/null +++ b/src/assets/images/Tutorials_Color.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/assets/images/users.svg b/src/assets/images/users.svg new file mode 100644 index 000000000..a8025466f --- /dev/null +++ b/src/assets/images/users.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/content/docs/aws/integrations/continuous-integration/bitbucket.md b/src/content/docs/aws/ci-pipelines/bitbucket.md similarity index 100% rename from src/content/docs/aws/integrations/continuous-integration/bitbucket.md rename to src/content/docs/aws/ci-pipelines/bitbucket.md diff --git a/src/content/docs/aws/integrations/continuous-integration/circleci.md b/src/content/docs/aws/ci-pipelines/circleci.md similarity index 99% rename from src/content/docs/aws/integrations/continuous-integration/circleci.md rename to src/content/docs/aws/ci-pipelines/circleci.md index 38534133c..f304bbd80 100644 --- a/src/content/docs/aws/integrations/continuous-integration/circleci.md +++ b/src/content/docs/aws/ci-pipelines/circleci.md @@ -92,7 +92,7 @@ workflows: To configure LocalStack use the `environment` key on the job level or a shell command, where the latter takes higher precedence. -Read more about the [configuration options](/aws/configuration/config/configuration) of LocalStack. +Read more about the [configuration options](/aws/customization/configuration-options) of LocalStack. #### Job level diff --git a/src/content/docs/aws/integrations/continuous-integration/codebuild.md b/src/content/docs/aws/ci-pipelines/codebuild.md similarity index 98% rename from src/content/docs/aws/integrations/continuous-integration/codebuild.md rename to src/content/docs/aws/ci-pipelines/codebuild.md index ce63c923f..f4e7060e8 100644 --- a/src/content/docs/aws/integrations/continuous-integration/codebuild.md +++ b/src/content/docs/aws/ci-pipelines/codebuild.md @@ -56,7 +56,7 @@ phases: ### Configuration -Get know more about the LocalStack [config options](/aws/configuration/config/configuration). +Get know more about the LocalStack [config options](/aws/customization/configuration-options). #### Native Runner diff --git a/src/content/docs/aws/integrations/continuous-integration/github-actions.md b/src/content/docs/aws/ci-pipelines/github-actions.md similarity index 100% rename from src/content/docs/aws/integrations/continuous-integration/github-actions.md rename to src/content/docs/aws/ci-pipelines/github-actions.md diff --git a/src/content/docs/aws/integrations/continuous-integration/gitlab-ci.md b/src/content/docs/aws/ci-pipelines/gitlab-ci.md similarity index 100% rename from src/content/docs/aws/integrations/continuous-integration/gitlab-ci.md rename to src/content/docs/aws/ci-pipelines/gitlab-ci.md diff --git a/src/content/docs/aws/integrations/continuous-integration/index.md b/src/content/docs/aws/ci-pipelines/index.md similarity index 100% rename from src/content/docs/aws/integrations/continuous-integration/index.md rename to src/content/docs/aws/ci-pipelines/index.md diff --git a/src/content/docs/aws/integrations/continuous-integration/travis-ci.md b/src/content/docs/aws/ci-pipelines/travis-ci.md similarity index 100% rename from src/content/docs/aws/integrations/continuous-integration/travis-ci.md rename to src/content/docs/aws/ci-pipelines/travis-ci.md diff --git a/src/content/docs/aws/configuration/config/index.md b/src/content/docs/aws/configuration/config/index.md deleted file mode 100644 index 363d4bbcd..000000000 --- a/src/content/docs/aws/configuration/config/index.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: Overview -description: This section describes the configuration options available for LocalStack, and how to configure them to suit your needs. -template: doc ---- - -LocalStack offers configuration options for customizing how services behave, how components interact, and how your local cloud environment is initialized. - -This section explains key configuration mechanisms (including environment variables, configuration files, and runtime hooks) along with internal features that let you adapt LocalStack to fit a variety of development and testing scenarios. - -The diagram below provides a high-level overview of what’s covered. - -![Understanding LocalStack configuration](/images/aws/understanding-localstack-overview.png) diff --git a/src/content/docs/aws/configuration/config/internal-endpoints.md b/src/content/docs/aws/configuration/config/internal-endpoints.md deleted file mode 100644 index 9ad73a3fe..000000000 --- a/src/content/docs/aws/configuration/config/internal-endpoints.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: Internal Endpoints -description: Overview of LocalStack and AWS specific internal endpoints for local development and testing -template: doc ---- - -LocalStack provides several internal endpoints for various local AWS services and LocalStack-specific features. -These endpoints are not part of the official AWS API and are available in the `/_localstack` and `/_aws` paths. -You can use [curl](https://curl.se/) or your favourite HTTP REST client to access endpoints. - -You can start your LocalStack instance and go to [http://localhost.localstack.cloud:4566/\_localstack/swagger](http://localhost.localstack.cloud:4566/_localstack/swagger) -to browse the Swagger UI, visualize and interact with all the API's resources implemented in LocalStack. - -### LocalStack endpoints - -The API path for the LocalStack internal resources is `/_localstack`. -Several endpoints are available under this path. -For instance, `/_localstack/health` checks the available and running AWS services in LocalStack while -`/_localstack/diagnose` (enable with the `DEBUG=1` configuration variable), reports extensive and sensitive data from -the LocalStack instance. - -:::note -You can use the `/_localstack/health` endpoint to restart or kill the services. -You can use [curl](https://curl.se/) or your HTTP REST client to access the endpoint: - -```bash -curl -v --request POST --header "Content-Type: application/json" --data '{"action":"restart"}' http://localhost.localstack.cloud:4566/_localstack/health -curl -v --request POST --header "Content-Type: application/json" --data '{"action":"kill"}' http://localhost.localstack.cloud:4566/_localstack/health -``` - -::: - -### AWS endpoints - -The API path for the AWS internal resources is `/_aws`. -These endpoints offer LocalStack-specific features in addition to the ones offered by the AWS services. -For instance, `/aws/services/sqs/messages` conveniently access all messages within a SQS queue, without deleting them. diff --git a/src/content/docs/aws/configuration/index.mdx b/src/content/docs/aws/configuration/index.mdx deleted file mode 100644 index ed3684e56..000000000 --- a/src/content/docs/aws/configuration/index.mdx +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: Overview -description: Configure your LocalStack installation in various ways, including configuration options, networking, SDKs, and extensions. -template: doc -editUrl: false -sidebar: - order: 5 ---- - -import SectionCards from '../../../../components/SectionCards.astro'; - -LocalStack provides a number of configuration options and supporting tools that help you set up and manage your local cloud environment. - -It brings together the configuration options that control LocalStack's behavior, networking setup for reaching your services, the LocalStack Web App, the LocalStack SDKs for programmatic access, and the extensions mechanism for adding new functionality. - -You will also find guides for several standalone tools: the [DNS Server](/aws/configuration/dns-server), [Testing Utils](/aws/configuration/testing-utils), the [LocalStack Docker Extension](/aws/configuration/localstack-docker-extension), and [LocalSurf](/aws/configuration/localsurf). - - diff --git a/src/content/docs/aws/configuration/web-app/index.md b/src/content/docs/aws/configuration/web-app/index.md deleted file mode 100644 index 823b15c5b..000000000 --- a/src/content/docs/aws/configuration/web-app/index.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Overview -description: The LocalStack web app allows you to access additional features of LocalStack as well as to manage subscription and licenses, workspace members and permissions. -template: doc -sidebar: - order: 1 ---- - -The [LocalStack Web Application](https://app.localstack.cloud/) provides a visual interface for managing your LocalStack account and platform features. - -From here, you can handle subscriptions and licenses, explore your local cloud environment with the Resource Browser, enable powerful features like Cloud Pods and Extensions, view Stack Insights, and more. All in one place. diff --git a/src/content/docs/aws/connecting/aws-sdks/dotnet.md b/src/content/docs/aws/connecting/aws-sdks/dotnet.md index 3faa8eda3..590a70873 100644 --- a/src/content/docs/aws/connecting/aws-sdks/dotnet.md +++ b/src/content/docs/aws/connecting/aws-sdks/dotnet.md @@ -133,7 +133,7 @@ var amazonS3Client = session.CreateClientByImplementation(); If you are building cloud-native applications with [Aspire](https://aspire.dev/), LocalStack provides first-class integration through the Aspire orchestration framework. The [`LocalStack.Aspire.Hosting`](https://github.com/localstack-dotnet/dotnet-aspire-for-localstack) package enables seamless local development with automatic container lifecycle management, service discovery, and observability integration. -For detailed guidance on using LocalStack with Aspire, including configuration options and example projects, see the [Aspire integration guide](/aws/integrations/app-frameworks/aspire). +For detailed guidance on using LocalStack with Aspire, including configuration options and example projects, see the [Aspire integration guide](/aws/customization/integrations/app-frameworks/aspire). ## Resources diff --git a/src/content/docs/aws/connecting/aws-sdks/index.mdx b/src/content/docs/aws/connecting/aws-sdks/index.mdx index c338ea3f9..f9941bed0 100644 --- a/src/content/docs/aws/connecting/aws-sdks/index.mdx +++ b/src/content/docs/aws/connecting/aws-sdks/index.mdx @@ -21,7 +21,7 @@ To connect to LocalStack services using AWS SDKs, you can use one of the followi This can also be specified using a [profile or an environment variable](https://docs.aws.amazon.com/sdkref/latest/guide/feature-ss-endpoints.html). - **Transparent endpoint injection (recommended):** Connect to LocalStack services without modifying your application code. Transparent endpoint injection uses the integrated DNS server to resolve AWS API calls to target LocalStack. - Refer to the [Transparent Endpoint Injection](/aws/configuration/networking/transparent-endpoint-injection/) guide for more information. + Refer to the [Transparent Endpoint Injection](/aws/customization/networking/transparent-endpoint-injection/) guide for more information. ## Supported SDKs diff --git a/src/content/docs/aws/connecting/aws-sdks/python-boto3.md b/src/content/docs/aws/connecting/aws-sdks/python-boto3.md index 4ba1d6ab9..0900ad786 100644 --- a/src/content/docs/aws/connecting/aws-sdks/python-boto3.md +++ b/src/content/docs/aws/connecting/aws-sdks/python-boto3.md @@ -29,7 +29,7 @@ if __name__ == "__main__": :::note -If you're connecting from within a Python **Lambda function** handler in LocalStack, you can create a default client without configuring the `endpoint_url` - LocalStack will automatically forward the invocations to the local API endpoints (available in Pro, see [here](/aws/configuration/networking/transparent-endpoint-injection) for more details). +If you're connecting from within a Python **Lambda function** handler in LocalStack, you can create a default client without configuring the `endpoint_url` - LocalStack will automatically forward the invocations to the local API endpoints (available in Pro, see [here](/aws/customization/networking/transparent-endpoint-injection) for more details). ::: ```python diff --git a/src/content/docs/aws/configuration/web-app/instance-management.md b/src/content/docs/aws/connecting/console/instance-management.md similarity index 75% rename from src/content/docs/aws/configuration/web-app/instance-management.md rename to src/content/docs/aws/connecting/console/instance-management.md index f10d180a2..e769ea7e2 100644 --- a/src/content/docs/aws/configuration/web-app/instance-management.md +++ b/src/content/docs/aws/connecting/console/instance-management.md @@ -3,22 +3,24 @@ title: Instance Management description: Instance Management allows you to view and manage your LocalStack instances through the LocalStack Web Application alongside other auxiliary features. template: doc sidebar: - order: 6 + order: 2 tags: ["Hobby"] --- ## Introduction -LocalStack Instance Management lets you view and manage your LocalStack instances while you build and test your cloud applications locally. -You can access this feature through the [**LocalStack Instances**](https://app.localstack.cloud/instances) section in the sidebar of the LocalStack Web Application. +Once your LocalStack instance is running, the [LocalStack Web Application](https://app.localstack.cloud/) is the primary way to access and inspect it from your browser, the local equivalent of opening the AWS Console. **Instance Management** is where you first connect to a running instance and see everything it exposes. -Instance Management offers these features: +You can access it through the [**LocalStack Instances**](https://app.localstack.cloud/instances) section in the sidebar of the LocalStack Web Application. + +From here you can view and manage your LocalStack instances while you build and test your cloud applications locally. Instance Management offers these features: - **Overview**: Shows the stack details of your LocalStack instances. - **Status**: Shows the status of the services running in the LocalStack container. - **Resource Browser**: Lets you view and manage your local AWS resources. - **State**: Allows you to export and import the state of your LocalStack instances. - **IAM Policy Stream**: Provides a stream of IAM policies corresponding to the AWS API calls. +- **App Inspector**: Provides insight into the state of your running application, including data payloads and IAM policy evaluation. - **Chaos Engineering**: Allows you to inject failures & simulate outages in your LocalStack instance. - **Extensions**: Provides extra integrations to improve your LocalStack experience. @@ -50,6 +52,6 @@ Tools like [simpleproxy](https://manpages.ubuntu.com/manpages/trusty/man1/simple Alternatively, you can direct `localhost.localstack.cloud` to your target machine's IP address by modifying the `/etc/hosts` file, which is useful if you’re using the LocalStack Web UI on a macOS or Linux-based machine. :::note -To bind to a custom IP address and port, configure the ['GATEWAY_LISTEN' configuration variable](/aws/configuration/config/configuration/#core). -For troubleshooting, refer to the [network troubleshooting docs](/aws/configuration/networking/). +To bind to a custom IP address and port, configure the ['GATEWAY_LISTEN' configuration variable](/aws/customization/configuration-options/#core). +For troubleshooting, refer to the [network troubleshooting docs](/aws/customization/networking/). ::: \ No newline at end of file diff --git a/src/content/docs/aws/connecting/console/resource-browser.md b/src/content/docs/aws/connecting/console/resource-browser.md index 790f8d38c..95193c43b 100644 --- a/src/content/docs/aws/connecting/console/resource-browser.md +++ b/src/content/docs/aws/connecting/console/resource-browser.md @@ -16,7 +16,7 @@ It provides an internal, integrated experience, similar to the AWS Management Co The Resource Browser provide an experience similar to the AWS Management Console. However, the Resource Browser is not a replacement for the AWS Management Console and only replicate some of the features of the AWS Management Console. -We recommend using our [integrations](/aws/integrations/) to create your resources, with the Resource Browser being used for quick viewing and management of your resources. +We recommend using our [integrations](/aws/customization/integrations/) to create your resources, with the Resource Browser being used for quick viewing and management of your resources. The LocalStack Web Application connects to your LocalStack container and retrieves the information about your local resources directly via `localhost` without using the internet. None of the information is sent to the internet, or stored on any external servers maintained by LocalStack. diff --git a/src/content/docs/aws/configuration/config/credentials.md b/src/content/docs/aws/connecting/credentials.md similarity index 95% rename from src/content/docs/aws/configuration/config/credentials.md rename to src/content/docs/aws/connecting/credentials.md index 78dc76586..01e8a0dfd 100644 --- a/src/content/docs/aws/configuration/config/credentials.md +++ b/src/content/docs/aws/connecting/credentials.md @@ -8,7 +8,7 @@ Like AWS, LocalStack requires AWS credentials to be supplied in all API operatio ## Access Key ID -For root accounts, the choice of access key ID affects [multi-account namespacing](/aws/configuration/config/multi-account-setups). +For root accounts, the choice of access key ID affects [multi-account namespacing](/aws/customization/advanced/multi-account-setups). Access key IDs can be one of following patterns: diff --git a/src/content/docs/aws/connecting/infrastructure-as-code/serverless-framework.md b/src/content/docs/aws/connecting/infrastructure-as-code/serverless-framework.md index 3535aace6..8c45ec9ea 100644 --- a/src/content/docs/aws/connecting/infrastructure-as-code/serverless-framework.md +++ b/src/content/docs/aws/connecting/infrastructure-as-code/serverless-framework.md @@ -125,7 +125,7 @@ else: ... ``` -In LocalStack for AWS, no code changes are required using our [Transparent Endpoint Injection](/aws/configuration/networking/transparent-endpoint-injection). +In LocalStack for AWS, no code changes are required using our [Transparent Endpoint Injection](/aws/customization/networking/transparent-endpoint-injection). ## Deploying to LocalStack diff --git a/src/content/docs/aws/configuration/config/arm64-support.md b/src/content/docs/aws/customization/advanced/arm64-support.md similarity index 97% rename from src/content/docs/aws/configuration/config/arm64-support.md rename to src/content/docs/aws/customization/advanced/arm64-support.md index 1fe8cdb46..f07b7f765 100644 --- a/src/content/docs/aws/configuration/config/arm64-support.md +++ b/src/content/docs/aws/customization/advanced/arm64-support.md @@ -1,6 +1,8 @@ --- title: ARM64 Support description: Running LocalStack on ARM64 CPUs +sidebar: + order: 2 --- ## Introduction @@ -32,7 +34,7 @@ Since LocalStack 2.0, Lambda functions execute in Docker containers with th depending on the [instruction set architecture](https://docs.aws.amazon.com/lambda/latest/dg/foundation-arch.html) configured for the function (`x86_64` by default or `arm64`). This behavior can lead to errors if the host system, the Docker image, or the code/layer of the function do not support the target architecture. -If you prefer to execute Lambda functions on your native platform architecture, you can set the [Lambda configuration](https://docs.localstack.cloud/aws/configuration/config/configuration/#lambda) variable to `LAMBDA_IGNORE_ARCHITECTURE=1`. +If you prefer to execute Lambda functions on your native platform architecture, you can set the [Lambda configuration](https://docs.localstack.cloud/aws/customization/configuration-options/#lambda) variable to `LAMBDA_IGNORE_ARCHITECTURE=1`. Example scenario: I have an amd64 machine and want to run a an arm64 Lambda function. I know that the Lambda function runs on both architectures (i.e., no architecture specific code or dependencies). Host systems with [multi-architecture support](https://docs.docker.com/build/building/multi-platform/) can run containers for different Linux architectures using emulation. diff --git a/src/content/docs/aws/configuration/config/cross-account-access.md b/src/content/docs/aws/customization/advanced/cross-account-access.md similarity index 97% rename from src/content/docs/aws/configuration/config/cross-account-access.md rename to src/content/docs/aws/customization/advanced/cross-account-access.md index 35366ac63..32bd17afb 100644 --- a/src/content/docs/aws/configuration/config/cross-account-access.md +++ b/src/content/docs/aws/customization/advanced/cross-account-access.md @@ -1,6 +1,8 @@ --- title: 'Cross-Account and Cross-Region Access' description: Accessing resources in another account or region +sidebar: + order: 3 --- ## Introduction @@ -59,7 +61,7 @@ The full list of resources and operations that allow cross-account access are li :::tip LocalStack does not enforce IAM for cross-account access by default. -Use the `ENFORCE_IAM` [configuration](/aws/configuration/config/configuration#iam) option to enable it. +Use the `ENFORCE_IAM` [configuration](/aws/customization/configuration-options#iam) option to enable it. ::: ### EC2 Peering diff --git a/src/content/docs/aws/configuration/config/filesystem.mdx b/src/content/docs/aws/customization/advanced/filesystem.mdx similarity index 95% rename from src/content/docs/aws/configuration/config/filesystem.mdx rename to src/content/docs/aws/customization/advanced/filesystem.mdx index 5d19eb217..cd00e0833 100644 --- a/src/content/docs/aws/configuration/config/filesystem.mdx +++ b/src/content/docs/aws/customization/advanced/filesystem.mdx @@ -1,7 +1,9 @@ --- title: Filesystem Layout -description: Overview of runtime directory structure +description: Understanding the runtime directory layout LocalStack uses internally template: doc +sidebar: + order: 5 --- import { FileTree } from '@astrojs/starlight/components'; @@ -46,7 +48,7 @@ LocalStack uses following directory layout when running within a container. ### Configuration - `/etc/localstack`: configuration directory -- `/etc/localstack/init`: root directory for [initialization hooks](/aws/configuration/config/initialization-hooks) +- `/etc/localstack/init`: root directory for [initialization hooks](/aws/customization/advanced/initialization-hooks) ### Static libraries diff --git a/src/content/docs/aws/customization/advanced/index.mdx b/src/content/docs/aws/customization/advanced/index.mdx new file mode 100644 index 000000000..e6f82bc04 --- /dev/null +++ b/src/content/docs/aws/customization/advanced/index.mdx @@ -0,0 +1,17 @@ +--- +title: Overview +description: Tailor LocalStack for complex setups using power-user features. +template: doc +editUrl: false +sidebar: + order: 1 +--- + +import SectionCards from '../../../../../components/SectionCards.astro'; + +LocalStack offers power-user features for tailoring the emulator for complex environments. Most users will not need to understand these features, but they are useful when you have complex requirements or are integrating LocalStack into a larger system. + + diff --git a/src/content/docs/aws/configuration/config/initialization-hooks.mdx b/src/content/docs/aws/customization/advanced/initialization-hooks.mdx similarity index 96% rename from src/content/docs/aws/configuration/config/initialization-hooks.mdx rename to src/content/docs/aws/customization/advanced/initialization-hooks.mdx index 7cc05be91..7f592dfc3 100644 --- a/src/content/docs/aws/configuration/config/initialization-hooks.mdx +++ b/src/content/docs/aws/customization/advanced/initialization-hooks.mdx @@ -3,6 +3,8 @@ title: Initialization Hooks description: Writing shell or Python scripts to customize or initialize your LocalStack instance. template: doc tags: ["Hobby"] +sidebar: + order: 6 --- import { Tabs, TabItem, FileTree } from '@astrojs/starlight/components'; @@ -34,7 +36,7 @@ All except `boot.d` will be run in the same Python interpreter as LocalStack, wh You can also use subdirectories to organize your init scripts. Currently, known script extensions are `.sh` and `.py`. -Additionally, with the installation of the `localstack-extension-terraform-init` [extension](/aws/configuration/extensions/), `.tf` files can also be supported. +Additionally, with the installation of the `localstack-extension-terraform-init` [extension](/aws/customization/integrations/extensions/), `.tf` files can also be supported. Shell scripts have to be executable, and have to have a [shebang](https://en.wikipedia.org/wiki/Shebang_(Unix)) (usually `#!/bin/bash`). A script can be in one of four states: `UNKNOWN`, `RUNNING`, `SUCCESSFUL`, `ERROR`. @@ -165,7 +167,7 @@ Another use for init hooks can be seen when [adding custom TLS certificates to L ### Terraform Files as Init Hooks Running Terraform configuration files as init hooks requires the installation of a special extension. -For more information on how to manage [LocalStack extensions](/aws/configuration/extensions/), please refer to the dedicated documentation page, +For more information on how to manage [LocalStack extensions](/aws/customization/integrations/extensions/), please refer to the dedicated documentation page, and for more details on running init hooks in development mode, you can check out the [extension repository description](https://github.com/localstack/localstack-extensions/tree/main/terraform-init). Start LocalStack with **`EXTENSION_AUTO_INSTALL="localstack-extension-terraform-init"`**. @@ -258,4 +260,4 @@ If you are having issues with your initialization hooks not being executed, plea * If your script does not show up in the list of discovered init scripts, please check your Docker volume mount. Most likely the scripts are not properly mounted into the Docker container. * Are resources not being created? - * Ensure that AWS [credentials](/aws/configuration/config/credentials) are set, e.g. through `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` environment variables. + * Ensure that AWS [credentials](/aws/connecting/credentials) are set, e.g. through `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` environment variables. diff --git a/src/content/docs/aws/configuration/config/multi-account-setups.md b/src/content/docs/aws/customization/advanced/multi-account-setups.md similarity index 95% rename from src/content/docs/aws/configuration/config/multi-account-setups.md rename to src/content/docs/aws/customization/advanced/multi-account-setups.md index aafc13e74..edecce812 100644 --- a/src/content/docs/aws/configuration/config/multi-account-setups.md +++ b/src/content/docs/aws/customization/advanced/multi-account-setups.md @@ -2,6 +2,8 @@ title: Multi-Account Setups description: Using LocalStack in multi-tenant setups template: doc +sidebar: + order: 4 --- :::note @@ -12,7 +14,7 @@ Please open a [GitHub Discussion](https://github.com/orgs/localstack/discussions LocalStack ships with multi-account support which allows namespacing based on AWS account ID. LocalStack uses the value in the AWS Access Key ID field for the purpose of namespacing over account ID. -For more information, see [Credentials](/aws/configuration/config/credentials). +For more information, see [Credentials](/aws/connecting/credentials). The Access Key ID field can be configured in the AWS CLI in multiple ways: please refer to [AWS CLI documentation](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-precedence). diff --git a/src/content/docs/aws/configuration/config/regions-coverage.md b/src/content/docs/aws/customization/advanced/regions-coverage.md similarity index 96% rename from src/content/docs/aws/configuration/config/regions-coverage.md rename to src/content/docs/aws/customization/advanced/regions-coverage.md index 87d55411f..f5dfa252f 100644 --- a/src/content/docs/aws/configuration/config/regions-coverage.md +++ b/src/content/docs/aws/customization/advanced/regions-coverage.md @@ -1,6 +1,8 @@ --- title: "Regions Coverage" -description: "This page lists the AWS Region Coverage for LocalStack's emulation of AWS services." +description: "Understanding the Region Coverage for LocalStack's emulation of AWS services." +sidebar: + order: 7 --- ## Introduction diff --git a/src/content/docs/aws/configuration/config/usage-tracking.md b/src/content/docs/aws/customization/advanced/usage-tracking.md similarity index 95% rename from src/content/docs/aws/configuration/config/usage-tracking.md rename to src/content/docs/aws/customization/advanced/usage-tracking.md index 5e59b4bcb..45e5364d1 100644 --- a/src/content/docs/aws/configuration/config/usage-tracking.md +++ b/src/content/docs/aws/customization/advanced/usage-tracking.md @@ -1,7 +1,9 @@ --- title: Usage Tracking -description: Understand what data LocalStack collects and how you can opt out of usage tracking +description: Understanding what data LocalStack collects and how you can opt out of usage tracking template: doc +sidebar: + order: 8 --- ## Overview @@ -12,7 +14,7 @@ It is tracked regardless of whether the user disables event tracking since we co ## LocalStack usage statistics -For Pro users, most of the information is collected to populate the [Stack Insights](/aws/configuration/web-app/stack-insights) dashboard. +For Pro users, most of the information is collected to populate the [Stack Insights](/aws/organizations-admin/stack-insights) dashboard. Collecting basic anonymized usage of AWS services helps us better direct engineering efforts to services that are used the most or cause the most issues. ### Session information diff --git a/src/content/docs/aws/configuration/config/configuration.md b/src/content/docs/aws/customization/configuration-options.md similarity index 97% rename from src/content/docs/aws/configuration/config/configuration.md rename to src/content/docs/aws/customization/configuration-options.md index 9ad76f33d..7b915a7c8 100644 --- a/src/content/docs/aws/configuration/config/configuration.md +++ b/src/content/docs/aws/customization/configuration-options.md @@ -1,6 +1,6 @@ --- title: Configuration -description: Overview of configuration options in LocalStack. +description: Set the environment variables and flags that change how LocalStack starts and runs. template: doc --- @@ -31,16 +31,16 @@ Options that affect the core LocalStack system. | `LOCALSTACK_HOST`| `localhost.localstack.cloud:4566` (default) | This is interpolated into URLs and addresses that are returned by LocalStack. It has the form `:`. | | `GATEWAY_LISTEN` | `0.0.0.0:4566` (default in Docker mode), `127.0.0.1:4566` (default in host mode) | Configures the bind addresses of LocalStack. It has the form `:(,:)*`. LocalStack for AWS adds port `443`. | | `USE_SSL` | `0` (default) | Whether to return URLs using HTTP (`0`) or HTTPS (`1`). Changed with 3.0.0. In earlier versions this was toggling SSL support on or off. | -| `PERSISTENCE` | `0` (default) | Enable persistence. See [Persistence Mechanism](/aws/developer-tools/snapshots/persistence) and [Filesystem Layout](/aws/configuration/config/filesystem). | +| `PERSISTENCE` | `0` (default) | Enable persistence. See [Persistence Mechanism](/aws/developer-tools/snapshots/persistence) and [Filesystem Layout](/aws/customization/advanced/filesystem). | | `MAIN_CONTAINER_NAME` | `localstack-main` (default) | Specify the main docker container name | | `LS_LOG` | `trace`, `trace-internal`, `debug`, `info`, `warn`, `error`, `warning`| Specify the log level. Currently overrides the `DEBUG` configuration. `trace` for detailed request/response, `trace-internal` for internal calls, too. | -| `EXTERNAL_SERVICE_PORTS_START` | `4510` (default) | Start of the [External Service Port Range](/aws/configuration/networking/external-port-range) (inclusive). | -| `EXTERNAL_SERVICE_PORTS_END` | `4560` (default) | End of the [External Service Port Range](/aws/configuration/networking/external-port-range) (exclusive). | +| `EXTERNAL_SERVICE_PORTS_START` | `4510` (default) | Start of the [External Service Port Range](/aws/customization/networking/external-port-range) (inclusive). | +| `EXTERNAL_SERVICE_PORTS_END` | `4560` (default) | End of the [External Service Port Range](/aws/customization/networking/external-port-range) (exclusive). | | `EAGER_SERVICE_LOADING` | `0` (default) \|`1` | Boolean that toggles lazy loading of services. If eager loading is enabled, services are started at LocalStack startup rather than their first use. Be aware that eager loading increases the LocalStack startup time. | -| `SERVICES`| `s3,sqs` | A comma-delimited string of services. Check the [internal health endpoint](/aws/configuration/networking/internal-endpoints#localstack-endpoints) `/_localstack/health` for valid service names. If `SERVICES` is set LocalStack will only load the listed services. All other services will be disabled and cannot be used. | +| `SERVICES`| `s3,sqs` | A comma-delimited string of services. Check the [internal health endpoint](/aws/customization/networking/internal-endpoints#localstack-endpoints) `/_localstack/health` for valid service names. If `SERVICES` is set LocalStack will only load the listed services. All other services will be disabled and cannot be used. | | `ALLOW_NONSTANDARD_REGIONS` | `0` (default) | Allows the use of non-standard AWS regions. By default, LocalStack only accepts [standard AWS regions](https://docs.aws.amazon.com/general/latest/gr/rande.html). | | `PARITY_AWS_ACCESS_KEY_ID` | `0` (default) | Enables the use production-like access key IDs. By default, LocalStack issues keys with `LSIA...` and `LKIA...` prefix, and will reject keys that start with `ASIA...` or `AKIA...`. | -| `LOCALSTACK_RESPONSE_HEADER_ENABLED` | `1` (default) \| `0` | Whether LocalStack adds the [`x-localstack` response header](/aws/configuration/networking/internal-endpoints#x-localstack-response-header) to every AWS API response. The header value is the LocalStack version and lets client tools detect LocalStack and its version. | +| `LOCALSTACK_RESPONSE_HEADER_ENABLED` | `1` (default) \| `0` | Whether LocalStack adds the [`x-localstack` response header](/aws/customization/networking/internal-endpoints#x-localstack-response-header) to every AWS API response. The header value is the LocalStack version and lets client tools detect LocalStack and its version. | ## CLI @@ -48,7 +48,7 @@ These options are applicable when using the CLI to start LocalStack. | Variable | Example Values | Description | | - | - | - | -| `LOCALSTACK_VOLUME_DIR` | `~/.cache/localstack/volume` (on Linux) | The location on the host of the LocalStack volume directory mount. See [Filesystem Layout](/aws/configuration/config/filesystem#using-the-cli) | +| `LOCALSTACK_VOLUME_DIR` | `~/.cache/localstack/volume` (on Linux) | The location on the host of the LocalStack volume directory mount. See [Filesystem Layout](/aws/customization/advanced/filesystem#using-the-cli) | | `CONFIG_PROFILE` | | The configuration profile to load. See [Profiles](#profiles) | | `CONFIG_DIR` | `~/.localstack` | The path where LocalStack can find configuration profiles and other CLI-specific configuration | @@ -262,8 +262,8 @@ Please consult the [migration guide](/aws/services/lambda#migrating-to-lambda-v2 | `BUCKET_MARKER_LOCAL` | `hot-reload` (default) | Magic S3 bucket name for [Hot Reloading](/aws/developer-tools/lambda-tools/hot-reloading). The S3Key points to the source code on the local file system. | | `HOSTNAME_FROM_LAMBDA` | `localstack` | Endpoint host under which APIs are accessible from Lambda containers (optional). This can be useful in docker-compose stacks to use the local container hostname if neither IP address nor container name of the main container are available (e.g., in CI). Often used in combination with `LAMBDA_DOCKER_NETWORK`.| | `LAMBDA_DISABLE_AWS_ENDPOINT_URL` | `0` (default) \| `1` | Whether to disable injecting the environment variable `AWS_ENDPOINT_URL`, which automatically configures [supported AWS SDKs](https://docs.aws.amazon.com/sdkref/latest/guide/feature-ss-endpoints.html). | -| `LAMBDA_DISABLE_JAVA_SDK_V2_CERTIFICATE_VALIDATION` | `1` (default) | Whether to disable the certificate name validation for [AWS Java SDK v2](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/home.html) calls when using [transparent endpoint injection](/aws/configuration/networking/transparent-endpoint-injection).| -| `LAMBDA_DOCKER_DNS` | `""` (default) | Optional custom DNS server for the container running your Lambda function. Overwrites the default LocalStack [DNS Server](/aws/configuration/dns-server). Hence, resolving `localhost.localstack.cloud` requires additional configuration. | +| `LAMBDA_DISABLE_JAVA_SDK_V2_CERTIFICATE_VALIDATION` | `1` (default) | Whether to disable the certificate name validation for [AWS Java SDK v2](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/home.html) calls when using [transparent endpoint injection](/aws/customization/networking/transparent-endpoint-injection).| +| `LAMBDA_DOCKER_DNS` | `""` (default) | Optional custom DNS server for the container running your Lambda function. Overwrites the default LocalStack [DNS Server](/aws/customization/networking/dns-server). Hence, resolving `localhost.localstack.cloud` requires additional configuration. | | `LAMBDA_DOCKER_FLAGS` | `-e KEY=VALUE`, `-v host:container`, `-p host:container`, `--add-host domain:ip` | Additional flags passed to Docker `run`\|`create` commands. Supports environment variables (also with `--env-file`, but the file has to be mounted into the LocalStack container), ports, volume mounts, extra hosts, networks, DNS servers, labels, ulimits, user, platform, and privileged mode. The `--env-file` argument for Docker `run` and Docker Compose have different feature sets. To provide both, we support the `--env-file` for environment files with the docker run syntax, while `--compose-env-file` supports the full docker compose features, like placeholders with `${}`, replacing quotes, etc. | | `LAMBDA_DOCKER_NETWORK` | `bridge` (Docker default) | [Docker network driver](https://docs.docker.com/network/) for the Lambda and ECS containers. Needs to be set to the network the LocalStack container is connected to. Limitation: `host` mode currently not supported. | | `LAMBDA_DOWNLOAD_AWS_LAYERS` | `1` (default, pro) | Whether to download public Lambda layers from AWS through a LocalStack proxy when creating or updating functions. | @@ -415,8 +415,8 @@ To learn more about these configuration options, see [Cloud Pods](/aws/developer | Variable | Example Values | Description | | - | - | - | -| `EXTENSION_AUTO_INSTALL` | | Install a list of extensions automatically at startup. Comma-separated list of extensions directives which will be installed automatically at startup (see [managing extensions](/aws/configuration/extensions/managing-extensions#automating-extensions-installation))| -| `EXTENSION_DEV_MODE` | `0` (default) \| `1` | Enables development mode for extensions. Refer to the [Extensions Development Guide](/aws/configuration/extensions/developing-extensions) for more information. | +| `EXTENSION_AUTO_INSTALL` | | Install a list of extensions automatically at startup. Comma-separated list of extensions directives which will be installed automatically at startup (see [managing extensions](/aws/customization/integrations/extensions/managing-extensions#automating-extensions-installation))| +| `EXTENSION_DEV_MODE` | `0` (default) \| `1` | Enables development mode for extensions. Refer to the [Extensions Development Guide](/aws/customization/integrations/extensions/developing-extensions) for more information. | ## Miscellaneous @@ -442,21 +442,21 @@ To learn more about these configuration options, see [Cloud Pods](/aws/developer ## DNS -To learn more about these configuration options, see [DNS Server](/aws/configuration/dns-server). +To learn more about these configuration options, see [DNS Server](/aws/customization/networking/dns-server). | Variable | Example Values | Description | | - | - | - | | `DNS_ADDRESS` | `0.0.0.0` (default) | Address the LocalStack should bind the DNS server on (port 53 tcp/udp). Value `0` to disable. | `DNS_SERVER` | Default upstream DNS or `8.8.8.8` (default) | Fallback DNS server for queries not handled by LocalStack. | `DNS_RESOLVE_IP` | `127.0.0.1` (default) | IP address the DNS server should return as A record for queries handled by LocalStack. If customized, this value will be returned in preference to the DNS server response. -| `DNS_NAME_PATTERNS_TO_RESOLVE_UPSTREAM` | `([^.]+\.)*(ecr\|lambda)\.[^.]+\.amazonaws\.com` (example) | List of domain names that should *NOT* be redirected by the LocalStack DNS to the LocalStack container, but instead always forwarded to the upstream resolver. This will *NOT* redirect requests made to LocalStack due to manual endpoint configuration. Comma-separated list of Python-flavored regex patterns. See [the DNS server documentation](/aws/configuration/dns-server#skip-localstack-dns-resolution) for more details. +| `DNS_NAME_PATTERNS_TO_RESOLVE_UPSTREAM` | `([^.]+\.)*(ecr\|lambda)\.[^.]+\.amazonaws\.com` (example) | List of domain names that should *NOT* be redirected by the LocalStack DNS to the LocalStack container, but instead always forwarded to the upstream resolver. This will *NOT* redirect requests made to LocalStack due to manual endpoint configuration. Comma-separated list of Python-flavored regex patterns. See [the DNS server documentation](/aws/customization/networking/dns-server#skip-localstack-dns-resolution) for more details. | `DNS_LOCAL_NAME_PATTERNS` | `([^.]+\.)*(ecr\|lambda)\.[^.]+\.amazonaws\.com` (example) | **Deprecated since 3.0.2** List of domain names that should *NOT* be redirected by the LocalStack DNS to the LocalStack container, but instead always forwarded to the upstream resolver. This will *NOT* redirect requests made to LocalStack due to manual endpoint configuration. Comma-separated list of Python-flavored regex patterns. **Renamed to `DNS_NAME_PATTERNS_TO_RESOLVE_UPSTREAM`** ## Transparent Endpoint Injection | Variable | Example Values | Description | | - | - | - | -| `DISABLE_TRANSPARENT_ENDPOINT_INJECTION` | `0` (default in Pro) \| `1` | Whether to disable DNS resolution of AWS hostnames to the LocalStack container. Pro feature. (see [Transparent Endpoint Injection](/aws/configuration/networking/transparent-endpoint-injection)) +| `DISABLE_TRANSPARENT_ENDPOINT_INJECTION` | `0` (default in Pro) \| `1` | Whether to disable DNS resolution of AWS hostnames to the LocalStack container. Pro feature. (see [Transparent Endpoint Injection](/aws/customization/networking/transparent-endpoint-injection)) ## LocalStack for AWS @@ -464,7 +464,7 @@ To learn more about these configuration options, see [DNS Server](/aws/configura |----------------------|----------------|-------------| | `ACTIVATE_PRO` | `0` \| `1` (default) | Whether Pro should be activated or not. This is set to true by default if using the `localstack/localstack-pro` container image. If set to `1`, LocalStack will fail to start if the license key activation did not work. If set to `0`, an attempt is made to start LocalStack without Pro features. | | `LOCALSTACK_AUTH_TOKEN` | | [Auth token](/aws/getting-started/auth-token) to activate LocalStack for AWS. | -| `LOCALSTACK_API_KEY` | | **Deprecated since 3.0.0** API key to activate LocalStack for AWS.
**Use the `LOCALSTACK_AUTH_TOKEN` instead (except for [CI environments](/aws/integrations/continuous-integration/)).** | +| `LOCALSTACK_API_KEY` | | **Deprecated since 3.0.0** API key to activate LocalStack for AWS.
**Use the `LOCALSTACK_AUTH_TOKEN` instead (except for [CI environments](/aws/ci-pipelines/)).** | | `LOG_LICENSE_ISSUES` | `0` \| `1` (default) | Whether to log issues with the license activation to the console. | ## Legacy @@ -522,9 +522,9 @@ These configurations have already been removed and **won't have any effect** on | `DATA_DIR`| 2.0.0 | blank (disabled/default), `/tmp/localstack/data` | Local directory for saving persistent data. Use `PERSISTENCE` instead. | | `DISABLE_TERM_HANDLER` | 2.0.0 | `""` (default) \| `1` | Whether to disable signal passing to LocalStack when running in docker. Enabling this will prevent an orderly shutdown when running inside LS in docker. Setting this to anything else than an empty string will disable it. | `HOST_TMP_FOLDER` | 2.0.0 | `/some/path` | Temporary folder on the host that gets mounted as `$TMPDIR/localstack` into the LocalStack container. Required only for Lambda volume mounts when using `LAMBDA_REMOTE_DOCKER=false.` | -| `INIT_SCRIPTS_PATH` | 2.0.0 | `/some/path` | Before 1.0, this was used to configure the path to the initializing files with extensions `.sh` that were found in `/docker-entrypoint-initaws.d`. This has been replaced by the [init-hook system](/aws/configuration/config/initialization-hooks/). | -| `LEGACY_DIRECTORIES` | 2.0.0 | `0` (default) | Use legacy method of managing internal filesystem layout. See [Filesystem Layout](/aws/configuration/config/filesystem). | -| `LEGACY_INIT_DIR` | 2.0.0 | `1` \| `0`(default) | Used with `INIT_SCRIPTS_PATH`. This has been replaced by the [init-hook system](/aws/configuration/config/initialization-hooks). | +| `INIT_SCRIPTS_PATH` | 2.0.0 | `/some/path` | Before 1.0, this was used to configure the path to the initializing files with extensions `.sh` that were found in `/docker-entrypoint-initaws.d`. This has been replaced by the [init-hook system](/aws/customization/advanced/initialization-hooks/). | +| `LEGACY_DIRECTORIES` | 2.0.0 | `0` (default) | Use legacy method of managing internal filesystem layout. See [Filesystem Layout](/aws/customization/advanced/filesystem). | +| `LEGACY_INIT_DIR` | 2.0.0 | `1` \| `0`(default) | Used with `INIT_SCRIPTS_PATH`. This has been replaced by the [init-hook system](/aws/customization/advanced/initialization-hooks). | | `MULTI_ACCOUNTS` | 2.0.0 | `0` (default) | Enable multi-accounts (preview) | | `SQS_PROVIDER` | 2.0.0 | `moto` (default) and `elasticmq` | | | `SYNCHRONOUS_API_GATEWAY_EVENTS` | 2.0.0 | `1` (default) \| `0` | Whether or not to handle API Gateway Lambda event sources as synchronous invocations. | diff --git a/src/content/docs/aws/customization/index.mdx b/src/content/docs/aws/customization/index.mdx new file mode 100644 index 000000000..d7169e7c8 --- /dev/null +++ b/src/content/docs/aws/customization/index.mdx @@ -0,0 +1,22 @@ +--- +title: Overview +description: Customize how the LocalStack emulator behaves, including configuration options, logging, Kubernetes, other installations, integrations, networking, and advanced features. +template: doc +editUrl: false +--- + +import SectionCards from '../../../../components/SectionCards.astro'; + +LocalStack provides a wide range of options for customizing how the emulator behaves and where it runs. Most users are well served by the defaults, but as your needs grow you can fine-tune everything from logging verbosity and networking to running on Kubernetes, alternative installation methods, and third-party integrations. + + diff --git a/src/content/docs/aws/integrations/app-frameworks/architect.md b/src/content/docs/aws/customization/integrations/app-frameworks/architect.md similarity index 100% rename from src/content/docs/aws/integrations/app-frameworks/architect.md rename to src/content/docs/aws/customization/integrations/app-frameworks/architect.md diff --git a/src/content/docs/aws/integrations/app-frameworks/aspire.md b/src/content/docs/aws/customization/integrations/app-frameworks/aspire.md similarity index 96% rename from src/content/docs/aws/integrations/app-frameworks/aspire.md rename to src/content/docs/aws/customization/integrations/app-frameworks/aspire.md index e003f0f4a..d9dbf2898 100644 --- a/src/content/docs/aws/integrations/app-frameworks/aspire.md +++ b/src/content/docs/aws/customization/integrations/app-frameworks/aspire.md @@ -12,7 +12,7 @@ sidebar: With Aspire, developers can orchestrate cloud-native applications locally using the same AWS resources they deploy in production. By combining Aspire with LocalStack, teams can emulate their full cloud environment—including Lambda, SQS, S3, and DynamoDB—with minimal configuration and no AWS costs. -LocalStack integrates with Aspire through the [`LocalStack.Aspire.Hosting`](https://github.com/localstack-dotnet/dotnet-aspire-for-localstack) package, enabling seamless local development and testing of AWS-powered applications within the Aspire orchestration framework. This package extends the official [AWS integrations for .NET Aspire](https://github.com/aws/integrations-on-dotnet-aspire-for-aws) to provide LocalStack-specific functionality. +LocalStack integrates with Aspire through the [`LocalStack.Aspire.Hosting`](https://github.com/localstack-dotnet/dotnet-aspire-for-localstack) package, enabling seamless local development and testing of AWS-powered applications within the Aspire orchestration framework. This package extends the official [AWS integrations for .NET Aspire](https://github.com/aws/customization/integrations-on-dotnet-aspire-for-aws) to provide LocalStack-specific functionality. ## Getting started @@ -168,7 +168,7 @@ An event registration system showcasing distributed tracing and observability pa - [Aspire Documentation](https://aspire.dev/) - [LocalStack.Aspire.Hosting on GitHub](https://github.com/localstack-dotnet/dotnet-aspire-for-localstack) - [LocalStack.Client on GitHub](https://github.com/localstack-dotnet/localstack-dotnet-client) -- [AWS Aspire Integration](https://github.com/aws/integrations-on-dotnet-aspire-for-aws) +- [AWS Aspire Integration](https://github.com/aws/customization/integrations-on-dotnet-aspire-for-aws) - [AWS SDK for .NET Documentation](https://docs.aws.amazon.com/sdk-for-net/) - [LocalStack Serverless .NET Demo](https://github.com/localstack-dotnet/localstack-serverless-dotnet-demo) - [OpenTelemetry with Aspire and LocalStack Demo](https://github.com/Blind-Striker/dotnet-otel-aspire-localstack-demo) diff --git a/src/content/docs/aws/integrations/messaging/docker-compose.yml b/src/content/docs/aws/customization/integrations/app-frameworks/docker-compose.yml similarity index 100% rename from src/content/docs/aws/integrations/messaging/docker-compose.yml rename to src/content/docs/aws/customization/integrations/app-frameworks/docker-compose.yml diff --git a/src/content/docs/aws/integrations/app-frameworks/index.md b/src/content/docs/aws/customization/integrations/app-frameworks/index.md similarity index 100% rename from src/content/docs/aws/integrations/app-frameworks/index.md rename to src/content/docs/aws/customization/integrations/app-frameworks/index.md diff --git a/src/content/docs/aws/integrations/app-frameworks/quarkus.md b/src/content/docs/aws/customization/integrations/app-frameworks/quarkus.md similarity index 100% rename from src/content/docs/aws/integrations/app-frameworks/quarkus.md rename to src/content/docs/aws/customization/integrations/app-frameworks/quarkus.md diff --git a/src/content/docs/aws/integrations/messaging/selfmanaged-kafka-cluster.md b/src/content/docs/aws/customization/integrations/app-frameworks/selfmanaged-kafka-cluster.md similarity index 91% rename from src/content/docs/aws/integrations/messaging/selfmanaged-kafka-cluster.md rename to src/content/docs/aws/customization/integrations/app-frameworks/selfmanaged-kafka-cluster.md index fb209fc4d..041fa8175 100644 --- a/src/content/docs/aws/integrations/messaging/selfmanaged-kafka-cluster.md +++ b/src/content/docs/aws/customization/integrations/app-frameworks/selfmanaged-kafka-cluster.md @@ -3,7 +3,7 @@ title: Self-managed Kafka cluster description: Using LocalStack Lambda with a self-managed Kafka cluster. template: doc sidebar: - order: 1 + order: 6 --- LocalStack for AWS supports [AWS Managed Streaming for Kafka (MSK)](/aws/services/kafka) and you can create Kafka clusters directly through the MSK API that will run in LocalStack. @@ -11,7 +11,7 @@ In some cases, you may want to run your own self-managed Kafka cluster and integ ## Running self-managed Kafka -You can find the [example Docker Compose](https://github.com/localstack/localstack-docs/blob/master/src/content/docs/aws/integrations/messaging/docker-compose.yml) file which contains a single-noded ZooKeeper and a Kafka cluster and a simple LocalStack setup as well as [Kowl](https://github.com/cloudhut/kowl), an Apache Kafka Web UI. +You can find the [example Docker Compose](https://github.com/localstack/localstack-docs/blob/master/src/content/docs/aws/customization/integrations/app-frameworks/docker-compose.yml) file which contains a single-noded ZooKeeper and a Kafka cluster and a simple LocalStack setup as well as [Kowl](https://github.com/cloudhut/kowl), an Apache Kafka Web UI. 1. Run Docker Compose: diff --git a/src/content/docs/aws/integrations/app-frameworks/spring-cloud-function.mdx b/src/content/docs/aws/customization/integrations/app-frameworks/spring-cloud-function.mdx similarity index 100% rename from src/content/docs/aws/integrations/app-frameworks/spring-cloud-function.mdx rename to src/content/docs/aws/customization/integrations/app-frameworks/spring-cloud-function.mdx diff --git a/src/content/docs/aws/configuration/extensions/developing-extensions.mdx b/src/content/docs/aws/customization/integrations/extensions/developing-extensions.mdx similarity index 100% rename from src/content/docs/aws/configuration/extensions/developing-extensions.mdx rename to src/content/docs/aws/customization/integrations/extensions/developing-extensions.mdx diff --git a/src/content/docs/aws/configuration/extensions/extensions-library.md b/src/content/docs/aws/customization/integrations/extensions/extensions-library.md similarity index 100% rename from src/content/docs/aws/configuration/extensions/extensions-library.md rename to src/content/docs/aws/customization/integrations/extensions/extensions-library.md diff --git a/src/content/docs/aws/configuration/extensions/index.md b/src/content/docs/aws/customization/integrations/extensions/index.md similarity index 87% rename from src/content/docs/aws/configuration/extensions/index.md rename to src/content/docs/aws/customization/integrations/extensions/index.md index 4cbdc7097..102905a2d 100644 --- a/src/content/docs/aws/configuration/extensions/index.md +++ b/src/content/docs/aws/customization/integrations/extensions/index.md @@ -25,7 +25,7 @@ Officially supported extensions are available in our [Official Extensions Librar :::tip Want to try out a common LocalStack extension? -Our [MailHog tutorial](/aws/configuration/extensions/mailhog) teaches you how to install and use the official MailHog extension. It’s a quick way to explore how extensions work in LocalStack. +Our [MailHog tutorial](/aws/customization/integrations/extensions/mailhog) teaches you how to install and use the official MailHog extension. It’s a quick way to explore how extensions work in LocalStack. ::: :::note diff --git a/src/content/docs/aws/configuration/extensions/mailhog.md b/src/content/docs/aws/customization/integrations/extensions/mailhog.md similarity index 93% rename from src/content/docs/aws/configuration/extensions/mailhog.md rename to src/content/docs/aws/customization/integrations/extensions/mailhog.md index 50c7b7392..8858dbff4 100644 --- a/src/content/docs/aws/configuration/extensions/mailhog.md +++ b/src/content/docs/aws/customization/integrations/extensions/mailhog.md @@ -76,6 +76,6 @@ You should see the email you sent in the MailHog UI. - Explore our collection of official extensions, along with a growing ecosystem of third-party extensions, in our [Extensions Library](https://app.localstack.cloud/extensions/library). - Learn about the various methods for extension management and automating their installation when using LocalStack in a CI environment. - Get detailed insights from our [Managing Extensions](/aws/configuration/extensions/managing-extensions) guide. + Get detailed insights from our [Managing Extensions](/aws/customization/integrations/extensions/managing-extensions) guide. - Want to create your own extensions? - Dive into our guide on [Developing Extensions](/aws/configuration/extensions/developing-extensions) for step-by-step instructions. + Dive into our guide on [Developing Extensions](/aws/customization/integrations/extensions/developing-extensions) for step-by-step instructions. diff --git a/src/content/docs/aws/configuration/extensions/managing-extensions.mdx b/src/content/docs/aws/customization/integrations/extensions/managing-extensions.mdx similarity index 98% rename from src/content/docs/aws/configuration/extensions/managing-extensions.mdx rename to src/content/docs/aws/customization/integrations/extensions/managing-extensions.mdx index fa5bd8629..1e0bb5df5 100644 --- a/src/content/docs/aws/configuration/extensions/managing-extensions.mdx +++ b/src/content/docs/aws/customization/integrations/extensions/managing-extensions.mdx @@ -11,7 +11,7 @@ import { FileTree } from '@astrojs/starlight/components'; You have different options to install and manage your LocalStack extensions depending on your environment and work style. -Extensions are managed through the LocalStack container, but stored in the [LocalStack volume](/aws/configuration/config/filesystem) on your host. +Extensions are managed through the LocalStack container, but stored in the [LocalStack volume](/aws/customization/advanced/filesystem) on your host. The next time you start up LocalStack, your extensions will still be there! ## Using the extensions manager in our App @@ -165,7 +165,7 @@ When LocalStack starts up, you should see it tries to install the extensions and ## Extension Management within LocalStack -Extensions in LocalStack are Python distributions that operate within their dedicated virtual environment, residing in the [LocalStack Volume](/aws/configuration/config/filesystem). +Extensions in LocalStack are Python distributions that operate within their dedicated virtual environment, residing in the [LocalStack Volume](/aws/customization/advanced/filesystem). This involves the creation of a"variable packages folder `/var/lib/localstack/lib`," where the volume management system establishes both an `extensions` folder and a virtual environment named `python_venv`. Within this environment, all extensions and their dependencies are managed. LocalStack integrates its virtual environment, ensuring the resolution of all transitive dependencies associated with extensions. diff --git a/src/content/docs/aws/customization/integrations/index.mdx b/src/content/docs/aws/customization/integrations/index.mdx new file mode 100644 index 000000000..8a0bb1202 --- /dev/null +++ b/src/content/docs/aws/customization/integrations/index.mdx @@ -0,0 +1,30 @@ +--- +title: Overview +description: Integrate LocalStack with third-party software and extend it with your own extensions and SDKs. +template: doc +editUrl: false +--- + +import SectionCards from '../../../../../components/SectionCards.astro'; + +LocalStack integrates with a wide range of third-party software from the cloud development ecosystem, and can be extended to fit your own tooling. This section is mostly useful to platform teams who need to wire LocalStack into existing development and testing workflows. + +## The Cloud Development Ecosystem + +Whether you’re adding an extension, driving LocalStack from the Java or Python SDKs, or wiring it into an application framework, this section shows how to integrate LocalStack with the tools you already use. + +![Sample of supported integrations](/images/aws/integrations-overview.png) + +## Integrations + +We strive to make integrating LocalStack into your workflow as seamless as possible. Explore LocalStack Extensions, the LocalStack SDKs, supported app frameworks, and testing integrations: + + diff --git a/src/content/docs/aws/configuration/localstack-sdks/index.md b/src/content/docs/aws/customization/integrations/localstack-sdks/index.md similarity index 100% rename from src/content/docs/aws/configuration/localstack-sdks/index.md rename to src/content/docs/aws/customization/integrations/localstack-sdks/index.md diff --git a/src/content/docs/aws/configuration/localstack-sdks/java-sdk.md b/src/content/docs/aws/customization/integrations/localstack-sdks/java-sdk.md similarity index 100% rename from src/content/docs/aws/configuration/localstack-sdks/java-sdk.md rename to src/content/docs/aws/customization/integrations/localstack-sdks/java-sdk.md diff --git a/src/content/docs/aws/configuration/localstack-sdks/python-sdk.md b/src/content/docs/aws/customization/integrations/localstack-sdks/python-sdk.md similarity index 100% rename from src/content/docs/aws/configuration/localstack-sdks/python-sdk.md rename to src/content/docs/aws/customization/integrations/localstack-sdks/python-sdk.md diff --git a/src/content/docs/aws/configuration/testing-utils.md b/src/content/docs/aws/customization/integrations/localstack-sdks/testing-utils.md similarity index 100% rename from src/content/docs/aws/configuration/testing-utils.md rename to src/content/docs/aws/customization/integrations/localstack-sdks/testing-utils.md diff --git a/src/content/docs/aws/integrations/testing/index.md b/src/content/docs/aws/customization/integrations/testing/index.md similarity index 100% rename from src/content/docs/aws/integrations/testing/index.md rename to src/content/docs/aws/customization/integrations/testing/index.md diff --git a/src/content/docs/aws/integrations/testing/lambdatest-hyperexecute.md b/src/content/docs/aws/customization/integrations/testing/lambdatest-hyperexecute.md similarity index 100% rename from src/content/docs/aws/integrations/testing/lambdatest-hyperexecute.md rename to src/content/docs/aws/customization/integrations/testing/lambdatest-hyperexecute.md diff --git a/src/content/docs/aws/integrations/testing/testcontainers.mdx b/src/content/docs/aws/customization/integrations/testing/testcontainers.mdx similarity index 100% rename from src/content/docs/aws/integrations/testing/testcontainers.mdx rename to src/content/docs/aws/customization/integrations/testing/testcontainers.mdx diff --git a/src/content/docs/aws/enterprise/kubernetes/concepts.md b/src/content/docs/aws/customization/kubernetes/concepts.md similarity index 96% rename from src/content/docs/aws/enterprise/kubernetes/concepts.md rename to src/content/docs/aws/customization/kubernetes/concepts.md index 851dd03d2..78f7ffa6c 100644 --- a/src/content/docs/aws/enterprise/kubernetes/concepts.md +++ b/src/content/docs/aws/customization/kubernetes/concepts.md @@ -93,9 +93,9 @@ This enables applications running in Kubernetes to interact with LocalStack usin ## Storage -LocalStack can store data that persists across sessions, such as data that can be used for [local persistence](https://docs.localstack.cloud/aws/developer-tools/snapshots/persistence/) or caching downloaded resources between sessions. See the [LocalStack volume](/aws/configuration/config/filesystem/#localstack-volume) page for more information. +LocalStack can store data that persists across sessions, such as data that can be used for [local persistence](https://docs.localstack.cloud/aws/developer-tools/snapshots/persistence/) or caching downloaded resources between sessions. See the [LocalStack volume](/aws/customization/advanced/filesystem/#localstack-volume) page for more information. -This volume directory can be created in Kubernetes using a [Persistent Volume](https://kubernetes.io/docs/concepts/storage/persistent-volumes/) and associated [Persistent Volume Claim](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims). This volume should be mounted into the pod at `/var/lib/localstack` to persist LocalStack state. See the [Operator](/aws/enterprise/kubernetes/kubernetes-operator/) and [Helm Chart](/aws/enterprise/kubernetes/deploy-helm-chart) documentation for specific details. +This volume directory can be created in Kubernetes using a [Persistent Volume](https://kubernetes.io/docs/concepts/storage/persistent-volumes/) and associated [Persistent Volume Claim](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims). This volume should be mounted into the pod at `/var/lib/localstack` to persist LocalStack state. See the [Operator](/aws/customization/kubernetes/kubernetes-operator/) and [Helm Chart](/aws/customization/kubernetes/deploy-helm-chart) documentation for specific details. ## Choose execution mode diff --git a/src/content/docs/aws/enterprise/kubernetes/configuration.md b/src/content/docs/aws/customization/kubernetes/configuration.md similarity index 96% rename from src/content/docs/aws/enterprise/kubernetes/configuration.md rename to src/content/docs/aws/customization/kubernetes/configuration.md index df509e804..c80fd325c 100644 --- a/src/content/docs/aws/enterprise/kubernetes/configuration.md +++ b/src/content/docs/aws/customization/kubernetes/configuration.md @@ -1,5 +1,5 @@ --- -title: Configuration +title: Kubernetes Configuration description: Kubernetes configuration reference for LocalStack running on Kubernetes template: doc sidebar: @@ -38,7 +38,7 @@ The value must be valid JSON. LOCALSTACK_K8S_POD_CONFIG='{"profiles":{"default":{"nodeSelector":{"pool":"general"}}}}' ``` -For the full JSON schema, profile resolution order, and examples, see [Pod Configuration](/aws/enterprise/kubernetes/pod-configuration/). +For the full JSON schema, profile resolution order, and examples, see [Pod Configuration](/aws/customization/kubernetes/pod-configuration/). ### Container security context @@ -91,7 +91,7 @@ Increase these values if your cluster is under heavy load or if image pulls are | `LOCALSTACK_K8S_NAMESPACE` | Kubernetes namespace for child pods | | `LOCALSTACK_K8S_LABELS` | Comma-separated `key=value` labels applied to child pods | | `LOCALSTACK_K8S_ANNOTATIONS` | Comma-separated `key=value` annotations applied to child pods | -| `LOCALSTACK_K8S_POD_CONFIG` | JSON pod configuration for supported child pods. See [Pod Configuration](/aws/enterprise/kubernetes/pod-configuration/) | +| `LOCALSTACK_K8S_POD_CONFIG` | JSON pod configuration for supported child pods. See [Pod Configuration](/aws/customization/kubernetes/pod-configuration/) | | `K8S_CONTAINER_SECURITY_CONTEXT` | JSON security context applied to child pod containers | | `K8S_CURL_INIT_IMAGE` | Init container image used for network readiness checks | | `LAMBDA_K8S_INIT_IMAGE` | Init container image used in Lambda pods | diff --git a/src/content/docs/aws/enterprise/kubernetes/deploy-helm-chart.md b/src/content/docs/aws/customization/kubernetes/deploy-helm-chart.md similarity index 100% rename from src/content/docs/aws/enterprise/kubernetes/deploy-helm-chart.md rename to src/content/docs/aws/customization/kubernetes/deploy-helm-chart.md diff --git a/src/content/docs/aws/integrations/containers/eksctl.mdx b/src/content/docs/aws/customization/kubernetes/eksctl.mdx similarity index 99% rename from src/content/docs/aws/integrations/containers/eksctl.mdx rename to src/content/docs/aws/customization/kubernetes/eksctl.mdx index 965ae6661..7d562d55f 100644 --- a/src/content/docs/aws/integrations/containers/eksctl.mdx +++ b/src/content/docs/aws/customization/kubernetes/eksctl.mdx @@ -3,7 +3,7 @@ title: eksctl description: Running `eksctl` on LocalStack to create EKS clusters. template: doc sidebar: - order: 5 + order: 9 --- import { Tabs, TabItem } from '@astrojs/starlight/components'; diff --git a/src/content/docs/aws/enterprise/kubernetes/faq.md b/src/content/docs/aws/customization/kubernetes/faq.md similarity index 97% rename from src/content/docs/aws/enterprise/kubernetes/faq.md rename to src/content/docs/aws/customization/kubernetes/faq.md index 04a365955..5a3199597 100644 --- a/src/content/docs/aws/enterprise/kubernetes/faq.md +++ b/src/content/docs/aws/customization/kubernetes/faq.md @@ -3,7 +3,7 @@ title: FAQ description: FAQ template: doc sidebar: - order: 9 + order: 11 tags: ["Enterprise"] --- @@ -171,7 +171,7 @@ Common causes for connection failure: * **Transparent Endpoint Injection** - * Review: [https://docs.localstack.cloud/aws/configuration/networking/transparent-endpoint-injection/](https://docs.localstack.cloud/aws/configuration/networking/transparent-endpoint-injection/) + * Review: [https://docs.localstack.cloud/aws/customization/networking/transparent-endpoint-injection/](https://docs.localstack.cloud/aws/customization/networking/transparent-endpoint-injection/) * **Egress restrictions** * Ensure cluster network policies allow outbound internet access. @@ -262,7 +262,7 @@ This usually means the cluster restricts which images can be pulled. * Allow the LocalStack images in your cluster * If you must use a custom image name or pull-through cache, see: - [https://docs.localstack.cloud/aws/configuration/config/configuration/](https://docs.localstack.cloud/aws/configuration/config/configuration/) + [https://docs.localstack.cloud/aws/customization/configuration-options/](https://docs.localstack.cloud/aws/customization/configuration-options/) ### Admission or security policy failures diff --git a/src/content/docs/aws/enterprise/kubernetes/index.md b/src/content/docs/aws/customization/kubernetes/index.md similarity index 96% rename from src/content/docs/aws/enterprise/kubernetes/index.md rename to src/content/docs/aws/customization/kubernetes/index.md index 13e6cb912..9ccf3c8b2 100644 --- a/src/content/docs/aws/enterprise/kubernetes/index.md +++ b/src/content/docs/aws/customization/kubernetes/index.md @@ -1,6 +1,6 @@ --- title: Overview -description: Kubernetes with LocalStack +description: Run LocalStack on Kubernetes, a common approach for enterprises to centrally manage their containers. template: doc sidebar: order: 1 diff --git a/src/content/docs/aws/enterprise/kubernetes/kubernetes-executor.md b/src/content/docs/aws/customization/kubernetes/kubernetes-executor.md similarity index 100% rename from src/content/docs/aws/enterprise/kubernetes/kubernetes-executor.md rename to src/content/docs/aws/customization/kubernetes/kubernetes-executor.md diff --git a/src/content/docs/aws/enterprise/kubernetes/kubernetes-operator.mdx b/src/content/docs/aws/customization/kubernetes/kubernetes-operator.mdx similarity index 97% rename from src/content/docs/aws/enterprise/kubernetes/kubernetes-operator.mdx rename to src/content/docs/aws/customization/kubernetes/kubernetes-operator.mdx index 7ae9ac479..245e69728 100644 --- a/src/content/docs/aws/enterprise/kubernetes/kubernetes-operator.mdx +++ b/src/content/docs/aws/customization/kubernetes/kubernetes-operator.mdx @@ -215,7 +215,7 @@ This works without additional DNS configuration in client applications. Requires Operator version 0.4.0 or later. ::: -To persist the [LocalStack volume](/aws/configuration/config/filesystem/#localstack-volume), use the `spec.pvcName` to specify the PVC you want to mount. This automatically mounts the PVC at `/var/lib/localstack`. +To persist the [LocalStack volume](/aws/customization/advanced/filesystem/#localstack-volume), use the `spec.pvcName` to specify the PVC you want to mount. This automatically mounts the PVC at `/var/lib/localstack`. For example: diff --git a/src/content/docs/aws/enterprise/kubernetes/limitations.md b/src/content/docs/aws/customization/kubernetes/limitations.md similarity index 98% rename from src/content/docs/aws/enterprise/kubernetes/limitations.md rename to src/content/docs/aws/customization/kubernetes/limitations.md index f8a29cb06..471436ad4 100644 --- a/src/content/docs/aws/enterprise/kubernetes/limitations.md +++ b/src/content/docs/aws/customization/kubernetes/limitations.md @@ -3,7 +3,7 @@ title: Limitations description: Known limitations when running LocalStack on Kubernetes template: doc sidebar: - order: 8 + order: 10 tags: ["Enterprise"] --- diff --git a/src/content/docs/aws/integrations/containers/openshift.md b/src/content/docs/aws/customization/kubernetes/openshift.md similarity index 99% rename from src/content/docs/aws/integrations/containers/openshift.md rename to src/content/docs/aws/customization/kubernetes/openshift.md index e432e67cb..be460aea5 100644 --- a/src/content/docs/aws/integrations/containers/openshift.md +++ b/src/content/docs/aws/customization/kubernetes/openshift.md @@ -3,7 +3,7 @@ title: OpenShift description: Use the OpenShift managed Kubernetes cluster to deploy LocalStack. template: doc sidebar: - order: 4 + order: 8 --- ## Introduction diff --git a/src/content/docs/aws/enterprise/kubernetes/pod-configuration.md b/src/content/docs/aws/customization/kubernetes/pod-configuration.md similarity index 95% rename from src/content/docs/aws/enterprise/kubernetes/pod-configuration.md rename to src/content/docs/aws/customization/kubernetes/pod-configuration.md index 7f32bf12e..91bbf5431 100644 --- a/src/content/docs/aws/enterprise/kubernetes/pod-configuration.md +++ b/src/content/docs/aws/customization/kubernetes/pod-configuration.md @@ -100,7 +100,7 @@ extraEnvVars: } ``` -If you deploy LocalStack with the [LocalStack Operator](/aws/enterprise/kubernetes/kubernetes-operator/), set the same configuration as structured YAML under `spec.podSchedulingConfig` in your `LocalStack` resource instead of passing JSON: +If you deploy LocalStack with the [LocalStack Operator](/aws/customization/kubernetes/kubernetes-operator/), set the same configuration as structured YAML under `spec.podSchedulingConfig` in your `LocalStack` resource instead of passing JSON: ```yaml apiVersion: api.localstack.cloud/v1alpha1 @@ -261,4 +261,4 @@ The following example schedules Lambda pods on dedicated nodes, adds tolerations - Use `LOCALSTACK_K8S_LABELS` and `LOCALSTACK_K8S_ANNOTATIONS` for simple labels and annotations that apply to all child pods. - Use `K8S_CONTAINER_SECURITY_CONTEXT` to configure the security context for child pod containers. -For the complete list of Kubernetes executor configuration variables, see the [Kubernetes configuration reference](/aws/enterprise/kubernetes/configuration/). +For the complete list of Kubernetes executor configuration variables, see the [Kubernetes configuration reference](/aws/customization/kubernetes/configuration/). diff --git a/src/content/docs/aws/configuration/config/logging.md b/src/content/docs/aws/customization/logging.md similarity index 91% rename from src/content/docs/aws/configuration/config/logging.md rename to src/content/docs/aws/customization/logging.md index 5e632e834..1684408c7 100644 --- a/src/content/docs/aws/configuration/config/logging.md +++ b/src/content/docs/aws/customization/logging.md @@ -1,6 +1,6 @@ --- title: Logging -description: Overview of LocalStack logging and error reporting +description: Control LocalStack log output, verbosity, and error reporting. template: doc --- @@ -63,5 +63,5 @@ With Docker/Docker-Compose, you can run `docker ps` to get the container ID of t To view the logs via a user interface, you can use the following options: -- [LocalStack Desktop](/aws/configuration/web-app/localstack-desktop/) -- [LocalStack Docker Extension](/aws/configuration/localstack-docker-extension/) +- [LocalStack Desktop](/aws/developer-tools/running-localstack/localstack-desktop/) +- [LocalStack Docker Extension](/aws/customization/other-installations/localstack-docker-extension/) diff --git a/src/content/docs/aws/configuration/networking/accessing-endpoint-url.mdx b/src/content/docs/aws/customization/networking/accessing-endpoint-url.mdx similarity index 97% rename from src/content/docs/aws/configuration/networking/accessing-endpoint-url.mdx rename to src/content/docs/aws/customization/networking/accessing-endpoint-url.mdx index 074e9b63a..36ace0ab8 100644 --- a/src/content/docs/aws/configuration/networking/accessing-endpoint-url.mdx +++ b/src/content/docs/aws/customization/networking/accessing-endpoint-url.mdx @@ -20,10 +20,10 @@ While the LocalStack CLI does this automatically, when running the Docker contai Check out the [getting started documentation](/aws/getting-started/installation) for more information. :::tip -If you bind a domain name to `localhost`, ensure that you are not subject to [DNS rebind protection](/aws/configuration/dns-server#dns-rebind-protection). +If you bind a domain name to `localhost`, ensure that you are not subject to [DNS rebind protection](/aws/customization/networking/dns-server#dns-rebind-protection). ::: -You can also use the `GATEWAY_LISTEN` [configuration variable](/aws/configuration/config/configuration) to change the exposed port if necessary. +You can also use the `GATEWAY_LISTEN` [configuration variable](/aws/customization/configuration-options) to change the exposed port if necessary. ## From a container LocalStack created diff --git a/src/content/docs/aws/configuration/networking/accessing-resources-created.md b/src/content/docs/aws/customization/networking/accessing-resources-created.md similarity index 90% rename from src/content/docs/aws/configuration/networking/accessing-resources-created.md rename to src/content/docs/aws/customization/networking/accessing-resources-created.md index 01fe286ae..e345d9934 100644 --- a/src/content/docs/aws/configuration/networking/accessing-resources-created.md +++ b/src/content/docs/aws/customization/networking/accessing-resources-created.md @@ -9,7 +9,7 @@ sidebar: If you have created a resource using LocalStack, such as an OpenSearch cluster or RDS database, you may need to access it from your application. Typically, these resources are accessible through a URL or a hostname provided by LocalStack. By default, LocalStack returns the hostname `localhost.localstack.cloud`, which resolves to LocalStack using DNS. -For special environments (e.g., proxies), the [configuration](/aws/configuration/config/configuration) `LOCALSTACK_HOST` customizes the URLs returned by LocalStack. +For special environments (e.g., proxies), the [configuration](/aws/customization/configuration-options) `LOCALSTACK_HOST` customizes the URLs returned by LocalStack. This guide will explore different scenarios and provide detailed instructions on accessing resources created by LocalStack under different scenarios. ## From your host @@ -24,7 +24,7 @@ Check out the [service-specific documentation](/aws/services) for more details. ![Accessing a resource created by LocalStack from a container created by LocalStack](/images/aws/6.svg) -Check out our documentation while [using the endpoint URL](/aws/configuration/networking/accessing-endpoint-url). +Check out our documentation while [using the endpoint URL](/aws/customization/networking/accessing-endpoint-url).
For LocalStack versions before 2.3.0 @@ -37,7 +37,7 @@ In that case, you can set the HOSTNAME_FROM_LAMBDA environment vari ![Accessing a resource created by LocalStack from a Docker container](/images/aws/9.svg) -Check out our documentation [on using the endpoint URL](/aws/configuration/networking/accessing-endpoint-url#from-your-container). +Check out our documentation [on using the endpoint URL](/aws/customization/networking/accessing-endpoint-url#from-your-container). ## From a separate host diff --git a/src/content/docs/aws/configuration/dns-server.md b/src/content/docs/aws/customization/networking/dns-server.md similarity index 97% rename from src/content/docs/aws/configuration/dns-server.md rename to src/content/docs/aws/customization/networking/dns-server.md index d92c7ff80..4c77bf77f 100644 --- a/src/content/docs/aws/configuration/dns-server.md +++ b/src/content/docs/aws/customization/networking/dns-server.md @@ -3,16 +3,18 @@ title: DNS Server description: Use LocalStack as DNS server to resolve AWS queries to LocalStack. template: doc tags: ["Hobby"] +sidebar: + order: 7 --- LocalStack includes a DNS server that enables seamless connectivity to LocalStack from different environments using `localhost.localstack.cloud`. The DNS server is available on all IPv4 addresses within the LocalStack container (i.e., listening to `0.0.0.0`) and resolves `localhost.localstack.cloud` to the LocalStack container. Therefore, containers that are configured to use the DNS server can reach LocalStack using `localhost.localstack.cloud`. This configuration happens automatically for containers created by LocalStack, including compute resources such as Lambda, ECS, and EC2. -Your container can be configured to use the DNS server as demonstrated in the [Network Troubleshooting guide](/aws/configuration/networking/accessing-endpoint-url/#from-the-same-computer). +Your container can be configured to use the DNS server as demonstrated in the [Network Troubleshooting guide](/aws/customization/networking/accessing-endpoint-url/#from-the-same-computer). If you wish to use the DNS server on your host system, follow the instructions under [System DNS configuration](#system-dns-configuration). -LocalStack for AWS additionally offers [Transparent Endpoint Injection](/aws/configuration/networking/transparent-endpoint-injection/) (active by default), +LocalStack for AWS additionally offers [Transparent Endpoint Injection](/aws/customization/networking/transparent-endpoint-injection/) (active by default), which enables seamless connectivity to LocalStack without changing your application code targeting AWS. The DNS server resolves AWS domains such as `*.amazonaws.com` including subdomains to the LocalStack container. Therefore, your application seamlessly accesses the LocalStack APIs instead of the real AWS APIs. @@ -69,7 +71,7 @@ We do not recommend disabling the DNS server since this disables resolving `loca ### LocalStack endpoints If you operate behind an enterprise proxy and wish to customize the domain name returned by LocalStack services (e.g., SQS queue URL), -check out the [Configuration](/aws/configuration/config/configuration#core) `LOCALSTACK_HOST`. +check out the [Configuration](/aws/customization/configuration-options#core) `LOCALSTACK_HOST`. If you wish to customize internal LocalStack DNS routing of `localhost.localstack.cloud`, refer to the instructions in the [Route53 documentation](/aws/services/route53#customizing-internal-endpoint-resolution). diff --git a/src/content/docs/aws/configuration/networking/external-port-range.mdx b/src/content/docs/aws/customization/networking/external-port-range.mdx similarity index 100% rename from src/content/docs/aws/configuration/networking/external-port-range.mdx rename to src/content/docs/aws/customization/networking/external-port-range.mdx diff --git a/src/content/docs/aws/configuration/networking/https-tls-support.mdx b/src/content/docs/aws/customization/networking/https-tls-support.mdx similarity index 90% rename from src/content/docs/aws/configuration/networking/https-tls-support.mdx rename to src/content/docs/aws/customization/networking/https-tls-support.mdx index 03ca238a6..1da16348c 100644 --- a/src/content/docs/aws/configuration/networking/https-tls-support.mdx +++ b/src/content/docs/aws/customization/networking/https-tls-support.mdx @@ -3,7 +3,7 @@ title: HTTPS/TLS Support description: Overview of TLS certificate coverage for the `localhost.localstack.cloud` domain and supported AWS regions for secure HTTPS access to LocalStack service endpoints. template: doc sidebar: - order: 7 + order: 8 --- ## Introduction @@ -15,7 +15,7 @@ https://s3.us-east-1.localhost.localstack.cloud:4566 ``` These certificates enable proper hostname validation for supported AWS regions when using HTTPS with SDKs, the AWS CLI, browsers, and other tools. -If LocalStack runs behind a corporate proxy that interferes with fetching the public certificate, you can set [`SSL_NO_VERIFY=1`](/aws/configuration/config/configuration#miscellaneous) to disable TLS verification when downloading the certificate from `localhost.localstack.cloud`. +If LocalStack runs behind a corporate proxy that interferes with fetching the public certificate, you can set [`SSL_NO_VERIFY=1`](/aws/customization/configuration-options#miscellaneous) to disable TLS verification when downloading the certificate from `localhost.localstack.cloud`. ### Supported Regions diff --git a/src/content/docs/aws/configuration/networking/index.mdx b/src/content/docs/aws/customization/networking/index.mdx similarity index 72% rename from src/content/docs/aws/configuration/networking/index.mdx rename to src/content/docs/aws/customization/networking/index.mdx index 91eed2a16..8b7000b78 100644 --- a/src/content/docs/aws/configuration/networking/index.mdx +++ b/src/content/docs/aws/customization/networking/index.mdx @@ -1,6 +1,6 @@ --- title: Overview -description: This section describes the networking capabilities of LocalStack, and how to configure them to suit your needs. +description: Expose endpoints, resolve DNS, and integrate LocalStack with your local network. template: doc sidebar: order: 1 @@ -18,86 +18,86 @@ Choose the scenario below that best describes your networking layout. Whether yo LocalStack only binds to IPv4 addresses (e.g. `127.0.0.1`). Make sure you're not trying to access LocalStack over IPv6. ::: -## [Using the endpoint URL](/aws/configuration/networking/accessing-endpoint-url) +## [Using the endpoint URL](/aws/customization/networking/accessing-endpoint-url) For example, setting the `endpoint_url` parameter with an [AWS SDK](/aws/connecting/aws-sdks/). :::note -TLS certificates for `localhost.localstack.cloud` support only certain AWS regions. See [TLS Certificate Coverage](/aws/configuration/networking/https-tls-support) for details. +TLS certificates for `localhost.localstack.cloud` support only certain AWS regions. See [TLS Certificate Coverage](/aws/customization/networking/https-tls-support) for details. ::: -## [Using transparent endpoint injection](/aws/configuration/networking/transparent-endpoint-injection) +## [Using transparent endpoint injection](/aws/customization/networking/transparent-endpoint-injection) For example, you have a Lambda function that needs to access LocalStack resources. -## [Accessing a resource created by LocalStack](/aws/configuration/networking/accessing-resources-created) +## [Accessing a resource created by LocalStack](/aws/customization/networking/accessing-resources-created) For example, you have created an OpenSearch cluster and are trying to access that resource by its URL. diff --git a/src/content/docs/aws/configuration/localstack-docker-extension.md b/src/content/docs/aws/customization/other-installations/localstack-docker-extension.md similarity index 97% rename from src/content/docs/aws/configuration/localstack-docker-extension.md rename to src/content/docs/aws/customization/other-installations/localstack-docker-extension.md index 97b39fae5..dc374971c 100644 --- a/src/content/docs/aws/configuration/localstack-docker-extension.md +++ b/src/content/docs/aws/customization/other-installations/localstack-docker-extension.md @@ -1,6 +1,6 @@ --- title: LocalStack Docker Extension -description: Getting started with LocalStack Extension for Docker Desktop. +description: Manage your LocalStack container directly from Docker Desktop with the LocalStack Extension. template: doc sidebar: order: 7 diff --git a/src/content/docs/aws/configuration/config/podman.md b/src/content/docs/aws/customization/other-installations/podman.md similarity index 98% rename from src/content/docs/aws/configuration/config/podman.md rename to src/content/docs/aws/customization/other-installations/podman.md index 019ac0cc6..e30bcf961 100644 --- a/src/content/docs/aws/configuration/config/podman.md +++ b/src/content/docs/aws/customization/other-installations/podman.md @@ -1,6 +1,6 @@ --- title: Podman -description: Running LocalStack inside Podman +description: Run LocalStack inside Podman, a Docker-compatible container engine. template: doc --- diff --git a/src/content/docs/aws/integrations/containers/rancher-desktop.mdx b/src/content/docs/aws/customization/other-installations/rancher-desktop.mdx similarity index 98% rename from src/content/docs/aws/integrations/containers/rancher-desktop.mdx rename to src/content/docs/aws/customization/other-installations/rancher-desktop.mdx index 9afdbeac6..3f0f8b3ac 100644 --- a/src/content/docs/aws/integrations/containers/rancher-desktop.mdx +++ b/src/content/docs/aws/customization/other-installations/rancher-desktop.mdx @@ -1,6 +1,6 @@ --- title: Rancher Desktop -description: Use Rancher Desktop with LocalStack. +description: Run LocalStack on the local container runtime provided by Rancher Desktop, a Docker Desktop alternative. template: doc sidebar: order: 6 diff --git a/src/content/docs/aws/developer-tools/lambda-tools/remote-debugging.mdx b/src/content/docs/aws/developer-tools/lambda-tools/remote-debugging.mdx index faa10d6d6..f04980338 100644 --- a/src/content/docs/aws/developer-tools/lambda-tools/remote-debugging.mdx +++ b/src/content/docs/aws/developer-tools/lambda-tools/remote-debugging.mdx @@ -173,7 +173,7 @@ Here's how to fix it: Should downloading the Lambda function code fail, here's how to fix it: -* Disable DNS rebind protection (see [LocalStack DNS docs](https://docs.localstack.cloud/aws/configuration/dns-server/#dns-rebind-protection)) +* Disable DNS rebind protection (see [LocalStack DNS docs](https://docs.localstack.cloud/aws/customization/networking/dns-server/#dns-rebind-protection)) * Use `127.0.0.1` instead of `localhost.localstack.cloud` (**Automatic** setup) * Run the `LocalStack: Configure AWS Profile "localstack"` command from the VS Code Command Palette which will auto-configure the correct endpoint. * Use `127.0.0.1` instead of `localhost.localstack.cloud` (**Manual** setup) @@ -336,7 +336,7 @@ to [iterate quickly over your function code](/aws/developer-tools/lambda-tools/h #### Configure LocalStack for VS Code remote Python debugging -First, make sure that LocalStack is started with the following configuration (see the [Configuration docs](/aws/configuration/config/configuration#lambda) for more information): +First, make sure that LocalStack is started with the following configuration (see the [Configuration docs](/aws/customization/configuration-options#lambda) for more information): ```bash LAMBDA_DOCKER_FLAGS='-p 19891:19891' localstack start diff --git a/src/content/docs/aws/configuration/web-app/localstack-desktop.md b/src/content/docs/aws/developer-tools/running-localstack/localstack-desktop.md similarity index 100% rename from src/content/docs/aws/configuration/web-app/localstack-desktop.md rename to src/content/docs/aws/developer-tools/running-localstack/localstack-desktop.md diff --git a/src/content/docs/aws/developer-tools/running-localstack/mcp-server.mdx b/src/content/docs/aws/developer-tools/running-localstack/mcp-server.mdx index 0e2118067..87feb6797 100644 --- a/src/content/docs/aws/developer-tools/running-localstack/mcp-server.mdx +++ b/src/content/docs/aws/developer-tools/running-localstack/mcp-server.mdx @@ -176,7 +176,7 @@ If your LocalStack instance runs on a different host or port, set the following | `LOCALSTACK_HOSTNAME` | `localhost` | Hostname of the LocalStack instance | | `LOCALSTACK_PORT` | `4566` | Port of the LocalStack instance | -You can also pass any [LocalStack configuration variable](/aws/configuration/config/configuration/) through the `env` block. +You can also pass any [LocalStack configuration variable](/aws/customization/configuration-options/) through the `env` block. These are forwarded to the container when the `localstack-management` tool starts it. ```json @@ -337,7 +337,7 @@ If a command fails due to a service not being emulated, the tool returns a link ### `localstack-extensions` -Install, uninstall, list, and discover [LocalStack Extensions](/aws/configuration/extensions/) from the marketplace. +Install, uninstall, list, and discover [LocalStack Extensions](/aws/customization/integrations/extensions/) from the marketplace. | Parameter | Type | Required | Description | |---|---|---|---| @@ -461,7 +461,7 @@ The following environment variables can be set in the `env` block of your MCP co | `MAIN_CONTAINER_NAME` | `localstack-main` | Name of the LocalStack Docker container | | `MCP_ANALYTICS_DISABLED` | `0` | Set to `1` to disable MCP analytics | -Any [LocalStack configuration variable](/aws/configuration/config/configuration/) can also be passed through the `env` block. +Any [LocalStack configuration variable](/aws/customization/configuration-options/) can also be passed through the `env` block. These are forwarded to the container when the `localstack-management` tool starts it. For example, to enable debug logging and persistence: diff --git a/src/content/docs/aws/developer-tools/security-testing/custom-tls-certificates.mdx b/src/content/docs/aws/developer-tools/security-testing/custom-tls-certificates.mdx index 20a837576..c4813cdc6 100644 --- a/src/content/docs/aws/developer-tools/security-testing/custom-tls-certificates.mdx +++ b/src/content/docs/aws/developer-tools/security-testing/custom-tls-certificates.mdx @@ -30,7 +30,7 @@ They all can be summarised as: ## Creating a custom docker image -If you run LocalStack in a docker container (which includes using [the CLI](/aws/getting-started/installation/#installing-localstack-cli), [docker](/aws/getting-started/installation/#docker), [docker-compose](/aws/getting-started/installation/#docker-compose), or [helm](/aws/enterprise/kubernetes/deploy-helm-chart)), to include a custom TLS root certificate a new docker image should be created. +If you run LocalStack in a docker container (which includes using [the CLI](/aws/getting-started/installation/#installing-localstack-cli), [docker](/aws/getting-started/installation/#docker), [docker-compose](/aws/getting-started/installation/#docker-compose), or [helm](/aws/customization/kubernetes/deploy-helm-chart)), to include a custom TLS root certificate a new docker image should be created. Create a `Dockerfile` containing the following commands: @@ -106,11 +106,11 @@ Then run LocalStack with the environment variables - `CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt`, and - `NODE_EXTRA_CA_CERTS=/etc/ssl/certs/ca-certificates.crt` -and follow the instructions fn the [init hooks documentation](/aws/configuration/config/initialization-hooks) for configuring LocalStack to use the hook directory as a `boot` hook. +and follow the instructions fn the [init hooks documentation](/aws/customization/advanced/initialization-hooks) for configuring LocalStack to use the hook directory as a `boot` hook. ## Disabling TLS verification for LocalStack Cloud -If your proxy intercepts traffic to LocalStack cloud services (e.g., license server), you can disable TLS verification for these specific requests using the `SSL_NO_VERIFY` [configuration variable](/aws/configuration/config/configuration#security) (or `LOCALSTACK_SSL_NO_VERIFY` in Docker). +If your proxy intercepts traffic to LocalStack cloud services (e.g., license server), you can disable TLS verification for these specific requests using the `SSL_NO_VERIFY` [configuration variable](/aws/customization/configuration-options#security) (or `LOCALSTACK_SSL_NO_VERIFY` in Docker). ```bash SSL_NO_VERIFY=1 localstack start diff --git a/src/content/docs/aws/developer-tools/snapshots/cloud-pods.mdx b/src/content/docs/aws/developer-tools/snapshots/cloud-pods.mdx index b9e08ee65..14b43118e 100644 --- a/src/content/docs/aws/developer-tools/snapshots/cloud-pods.mdx +++ b/src/content/docs/aws/developer-tools/snapshots/cloud-pods.mdx @@ -286,7 +286,7 @@ In addition to loading Cloud Pods through the Command-Line Interface (CLI) or th ### Environmental variables -To automatically load a Cloud Pod at startup, utilize the `AUTO_LOAD_POD` [configuration variable](/aws/configuration/config/configuration/). +To automatically load a Cloud Pod at startup, utilize the `AUTO_LOAD_POD` [configuration variable](/aws/customization/configuration-options/). `AUTO_LOAD_POD` can accept multiple Cloud Pod names separated by commas. To autoload multiple Cloud Pods, such as `foo-pod` and `bar-pod`, use: `AUTO_LOAD_POD=foo-pod,bar-pod`. @@ -522,7 +522,7 @@ services: :::note The Auto Load from remote feature does not automatically configure the remote. This needs to be done with the `localstack pod remote add ...` command. -This commands creates a configuration file for the remote in the [LocalStack volume directory](/aws/configuration/config/filesystem/#localstack-volume-directory). +This commands creates a configuration file for the remote in the [LocalStack volume directory](/aws/customization/advanced/filesystem/#localstack-volume-directory). ::: ## End-to-End Encryption @@ -575,7 +575,7 @@ The process is the following: Unless explicitly specified, all Cloud Pods commands default to targeting the LocalStack Platform as the storage remote. It's important to note that the CLI must be authenticated correctly with our Platform. -Custom remote configurations are stored within the [LocalStack volume directory](/aws/configuration/config/filesystem/#localstack-volume-directory) and are managed by the LocalStack container. +Custom remote configurations are stored within the [LocalStack volume directory](/aws/customization/advanced/filesystem/#localstack-volume-directory) and are managed by the LocalStack container. Consequently, when sharing Cloud Pods among your team using a custom remote, each team member must define the identical remote configuration. Once added, a remote persists even after LocalStack restarts. @@ -590,7 +590,7 @@ The available strategies are: - `service-merge`: This strategy merges services at the account-region level, provided there's no overlap in resources. It prioritizes the loaded resources when merging. -The LocalStack's default merge strategy can be changed via the `MERGE_STRATEGY` [configuration variable](/aws/configuration/config/configuration/). +The LocalStack's default merge strategy can be changed via the `MERGE_STRATEGY` [configuration variable](/aws/customization/configuration-options/). ### LocalStack CLI @@ -750,4 +750,4 @@ If you're still unable to connect to the S3 bucket, add the bucket hostname to t DNS_NAME_PATTERNS_TO_RESOLVE_UPSTREAM=ls-pods-bucket-test.s3.amazonaws.com/ ``` -For more details, see the [Skip LocalStack DNS Resolution](/aws/configuration/dns-server/#skip-localstack-dns-resolution) section. \ No newline at end of file +For more details, see the [Skip LocalStack DNS Resolution](/aws/customization/networking/dns-server/#skip-localstack-dns-resolution) section. diff --git a/src/content/docs/aws/enterprise/index.mdx b/src/content/docs/aws/enterprise/index.mdx deleted file mode 100644 index 3d35d2268..000000000 --- a/src/content/docs/aws/enterprise/index.mdx +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Overview -description: LocalStack Enterprise provides the most sophisticated and secure setup we offer, with advanced features and capabilities for large organizations and teams. -template: doc -editUrl: false -sidebar: - order: 1 ---- - -import SectionCards from '../../../../components/SectionCards.astro'; - -LocalStack Enterprise provides advanced features and deployment options for teams operating at scale. This section includes guides and resources to help you get the most out of your Enterprise subscription, such as setting up air-gapped environments to integrate with Kubernetes or configuring SSO. - -Explore how to: - -- Run LocalStack in secure or offline setups with a custom Enterprise Image -- Set up Single Sign-On (SSO) across identity providers -- Deploy LocalStack into Kubernetes with the Kubernetes Operator and Executor -- Access tailored support options as an Enterprise customer - - diff --git a/src/content/docs/aws/getting-started/auth-token.mdx b/src/content/docs/aws/getting-started/auth-token.mdx index 101701920..9b105b903 100644 --- a/src/content/docs/aws/getting-started/auth-token.mdx +++ b/src/content/docs/aws/getting-started/auth-token.mdx @@ -106,7 +106,7 @@ You have the option to run your LocalStack container in the background by append The `localstack` CLI automatically detects the Auth Token and appropriately conveys it to the LocalStack container. :::note -If you are using LocalStack with an Auth Token, it's necessary to download the [LocalStack for AWS image](/aws/configuration/config/docker-images#localstack-for-aws-image), which includes Pro services and several advanced features. +If you are using LocalStack with an Auth Token, it's necessary to download the [LocalStack for AWS image](/aws/customization/other-installations/docker-images#localstack-for-aws-image), which includes Pro services and several advanced features. ::: ### Docker @@ -143,7 +143,7 @@ Developer Auth Tokens cannot be used in CI. CI Auth Tokens are available on the [Auth Tokens page](https://app.localstack.cloud/workspace/auth-tokens) and are configured similarly to Developer Auth Tokens. To set the CI Auth Token, add the Auth Token value in the `LOCALSTACK_AUTH_TOKEN` environment variable of your CI provider, and refer to it when starting LocalStack in your CI workflow. -You can find detailed examples in our [LocalStack in CI documentation](/aws/integrations/continuous-integration/). +You can find detailed examples in our [LocalStack in CI documentation](/aws/ci-pipelines/). ## Rotating the Auth Token @@ -159,7 +159,7 @@ To rotate your Auth Token, go to the [Auth Token page](https://app.localstack.cl ## Licensing configuration & activation checkup To avoid logging any licensing-related error messages, set `LOG_LICENSE_ISSUES=0` in your environment. -Refer to our [configuration guide](/aws/configuration/config/configuration/#localstack-for-aws) for more information. +Refer to our [configuration guide](/aws/customization/configuration-options/#localstack-for-aws) for more information. The simplest method to verify if LocalStack is active is by querying the health endpoint for a list of running services: diff --git a/src/content/docs/aws/getting-started/faq.mdx b/src/content/docs/aws/getting-started/faq.mdx index 16a420dd0..62106f672 100644 --- a/src/content/docs/aws/getting-started/faq.mdx +++ b/src/content/docs/aws/getting-started/faq.mdx @@ -19,7 +19,7 @@ To resolve the issue follow the steps: This can be done by deleting the cached certificate file. For example, on Linux systems, you can locate and remove the file at `~/.cache/localstack/volume/cache/server.test.pem`. The exact path may differ depending on your operating system and how you've started LocalStack. - Please refer to our [documentation](/aws/configuration/config/filesystem/#localstack-volume-directory) for specific instructions. + Please refer to our [documentation](/aws/customization/advanced/filesystem/#localstack-volume-directory) for specific instructions. **Workarounds for older (<v3.7.0) LocalStack versions:** @@ -183,7 +183,7 @@ If the container can reach the internet generally but not LocalStack endpoints s Using LocalStack inside a Docker network with multiple other containers can lead to connectivity issues from/to those containers. For example, a container which attempts to deploy a stack and interact with the services directly, from within the same Docker network. -Refer to our [network troubleshooting guide](/aws/configuration/networking/) covering several scenarios. +Refer to our [network troubleshooting guide](/aws/customization/networking/) covering several scenarios. ### How to resolve the pull rate limit issue for LocalStack's Docker image? @@ -314,7 +314,7 @@ The CLI also supports a `--debug` flag that prints host-side debug output (host localstack --debug start ``` -See the [Logging reference](/aws/configuration/config/logging/) for the full list of log-related options. +See the [Logging reference](/aws/customization/logging/) for the full list of log-related options. ### How do I capture and share LocalStack container logs for troubleshooting? @@ -389,7 +389,7 @@ Common causes: ``` 3. **The billing system has not yet activated your renewal.** Check the subscription status at [app.localstack.cloud/account/subscriptions](https://app.localstack.cloud/account/subscriptions). If the subscription is paid but still shows `EXPIRED`, open a support ticket with your workspace name and the last four characters of the auth token. -4. **Wrong license type assigned.** Sometimes a user is on an expired Trial or Hobby license. Unassign the old license and assign a paid one — see [Managing users and licenses](/aws/configuration/web-app/managing-users-licenses/#managing-licenses). +4. **Wrong license type assigned.** Sometimes a user is on an expired Trial or Hobby license. Unassign the old license and assign a paid one — see [Managing users and licenses](/aws/organizations-admin/managing-users-licenses/#managing-licenses). ### Why does my license show as SUSPENDED? @@ -701,7 +701,7 @@ Open a ticket by emailing `support@localstack.cloud`. | `SSL_NO_VERIFY` | `1` to disable outbound TLS verification (debug only) | | `ACTIVATE_PRO` | `0` to start LocalStack without Pro features (lets the container boot even if license activation fails) | -For the full configuration reference, see the [Configuration reference](/aws/configuration/config/configuration/) and the broader [Networking documentation](/aws/configuration/networking/). +For the full configuration reference, see the [Configuration reference](/aws/customization/configuration-options/) and the broader [Networking documentation](/aws/customization/networking/). ## LocalStack Platform FAQs diff --git a/src/content/docs/aws/getting-started/installation.mdx b/src/content/docs/aws/getting-started/installation.mdx index 27fee5d06..c5e333e0f 100644 --- a/src/content/docs/aws/getting-started/installation.mdx +++ b/src/content/docs/aws/getting-started/installation.mdx @@ -264,16 +264,16 @@ LocalStack runs inside a Docker container, and the above options are different w The LocalStack emulator is available on Docker Hub (`localstack/localstack-pro`). -For a comprehensive overview of the LocalStack images, check out our [Docker images documentation](/aws/configuration/config/docker-images). +For a comprehensive overview of the LocalStack images, check out our [Docker images documentation](/aws/customization/other-installations/docker-images). ### LocalStack Desktop -Learn more about our desktop client at [LocalStack Desktop](/aws/configuration/web-app/localstack-desktop) and download it [here](https://app.localstack.cloud/download). +Learn more about our desktop client at [LocalStack Desktop](/aws/developer-tools/running-localstack/localstack-desktop) and download it [here](https://app.localstack.cloud/download). ### LocalStack Docker Extension Install our [official Docker Desktop extension](https://hub.docker.com/extensions/localstack/localstack-docker-desktop) to manage LocalStack. -See [LocalStack Docker Extension](/aws/configuration/localstack-docker-extension) for more information. +See [LocalStack Docker Extension](/aws/customization/other-installations/localstack-docker-extension) for more information. ### Docker-Compose @@ -385,7 +385,7 @@ docker run \ - Mounting the Docker socket `/var/run/docker.sock` as a volume is required for some services that use Docker to provide the emulation, such as AWS Lambda. Check out the [Lambda providers](/aws/services/lambda) documentation for more information. -- When using Docker to manually start LocalStack, you will have to configure the container on your own (see [docker-compose-pro.yml](https://github.com/localstack/localstack/blob/main/docker-compose-pro.yml) and [Configuration](/aws/configuration/config/configuration). +- When using Docker to manually start LocalStack, you will have to configure the container on your own (see [docker-compose-pro.yml](https://github.com/localstack/localstack/blob/main/docker-compose-pro.yml) and [Configuration](/aws/customization/configuration-options). This could be seen as the "expert mode" of starting LocalStack. If you are looking for a simpler method of starting LocalStack, please use the [LocalStack CLI](#localstack-cli). @@ -397,21 +397,21 @@ docker run \ ### LocalStack Operator -If you want to deploy LocalStack in your [Kubernetes](https://kubernetes.io) cluster, you can use the [LocalStack Operator](/aws/enterprise/kubernetes/kubernetes-operator). +If you want to deploy LocalStack in your [Kubernetes](https://kubernetes.io) cluster, you can use the [LocalStack Operator](/aws/customization/kubernetes/kubernetes-operator). ## What's next? Now that you have LocalStack up and running, the following resources might be useful for your next steps: - Check out our [Quickstart guide](/aws/getting-started/quickstart) if you are a new user to get started with LocalStack quickly. -- [Use the LocalStack integrations](/aws/integrations) to interact with LocalStack and other integrated tools, for example: +- [Use the LocalStack integrations](/aws/customization/integrations) to interact with LocalStack and other integrated tools, for example: - Use `awslocal` to use the AWS CLI against your local cloud! - Use the Serverless Framework with LocalStack! - And many more! -- [Find out how to configure LocalStack](/aws/configuration/config/configuration) such that it perfectly fits your need. -- [Use LocalStack in your CI environment](/aws/integrations/continuous-integration/) to increase your code quality. +- [Find out how to configure LocalStack](/aws/customization/configuration-options) such that it perfectly fits your need. +- [Use LocalStack in your CI environment](/aws/ci-pipelines/) to increase your code quality. - [Checkout LocalStack's Cloud Developer Tools](/aws/developer-tools/) to further increase your development efficiency with LocalStack. -- Find out about the ways you can [configure LocalStack](/aws/configuration/config/configuration). +- Find out about the ways you can [configure LocalStack](/aws/customization/configuration-options). ## Troubleshooting @@ -432,7 +432,7 @@ python3 -m localstack.cli.main If you are using the `localstack` CLI to start LocalStack, but the container is not starting, please check the following: -- Uncheck the **Use kernel networking for UDP** option in Docker Desktop (**Settings** → **Resources** → **Network**) or follow the steps in our [documentation](/aws/configuration/dns-server#system-dns-configuration) to disable it. +- Uncheck the **Use kernel networking for UDP** option in Docker Desktop (**Settings** → **Resources** → **Network**) or follow the steps in our [documentation](/aws/customization/networking/dns-server#system-dns-configuration) to disable it. - Start LocalStack with a specific DNS address: ```bash @@ -480,6 +480,6 @@ After running the task, run the diagnostic endpoint and share the archive file w #### My application cannot reach LocalStack over the network -We have extensive network troubleshooting documentation available [here](/aws/configuration/networking/). +We have extensive network troubleshooting documentation available [here](/aws/customization/networking/). If this does not solve your problem then please [reach out to LocalStack Support](/aws/help-support/get-help/). diff --git a/src/content/docs/aws/getting-started/quickstart.mdx b/src/content/docs/aws/getting-started/quickstart.mdx index 643de4ac5..25b21f6c2 100644 --- a/src/content/docs/aws/getting-started/quickstart.mdx +++ b/src/content/docs/aws/getting-started/quickstart.mdx @@ -356,6 +356,9 @@ To expand your LocalStack capabilities, explore the following based on your expe - [Tutorials](/aws/tutorials): Check out our tutorials to learn how to use LocalStack across various AWS services and application stacks. - [Supported Services](/aws/services): Explore LocalStack's emulated AWS services. -- [Capabilities](/aws/configuration/): Learn about LocalStack's capabilities including features like IAM policy stream, state management, and more. -- [Tooling](/aws/developer-tools/): Get details on LocalStack's tooling and integrations. +- [Connecting](/aws/connecting/): Connect to LocalStack from the AWS CLI, SDKs, IaC tools, IDEs, and the web Console. +- [Developer Tools](/aws/developer-tools/): Use LocalStack's tooling, including App Inspector, Cloud Pods, Chaos Engineering, and the Lambda developer tools. +- [CI Pipelines](/aws/ci-pipelines/): Run LocalStack in your CI pipelines for automated integration testing. +- [Customization](/aws/customization/): Customize how LocalStack behaves, from configuration options and Kubernetes to third-party integrations. +- [Organizations & Admin](/aws/organizations-admin/): Manage accounts, workspaces, users, licenses, and single sign-on for your team. - [Blog](https://blog.localstack.cloud): Read our blog posts about LocalStack and the latest enhancements for a better local development and testing experience. diff --git a/src/content/docs/aws/index.mdx b/src/content/docs/aws/index.mdx index 1c6a5258b..86ecc55d2 100644 --- a/src/content/docs/aws/index.mdx +++ b/src/content/docs/aws/index.mdx @@ -11,11 +11,13 @@ sidebar: import { OverviewCards, HeroCards } from '../../../components/OverviewCards'; // Import SVGs from assets folder import rocketIcon from '../../../assets/images/GettingStarted_Color.svg'; -import buildingsIcon from '../../../assets/images/Enterprise_Color.svg'; import wrenchIcon from '../../../assets/images/Tooling_color.svg'; -import connectionsIcon from '../../../assets/images/Integrations_Color.svg'; import cubeIcon from '../../../assets/images/LSAWS_Color.svg'; import starburstIcon from '../../../assets/images/Capabilities_Color.svg'; +import plugIcon from '../../../assets/images/Connecting_Color.svg'; +import pipelineIcon from '../../../assets/images/CIPipelines_Color.svg'; +import usersIcon from '../../../assets/images/OrganizationsAdmin_Color.svg'; +import bookIcon from '../../../assets/images/Tutorials_Color.svg'; diff --git a/src/content/docs/aws/integrations/messaging/index.md b/src/content/docs/aws/integrations/messaging/index.md deleted file mode 100644 index 30cda01ce..000000000 --- a/src/content/docs/aws/integrations/messaging/index.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Overview -description: Use LocalStack with messaging tools, such as Kafka, to test your messaging infrastructure locally. -template: doc -sidebar: - order: 1 ---- - -LocalStack supports messaging and event-driven architectures by integrating with services like Amazon MSK (Managed Streaming for Apache Kafka). This section explains how to connect LocalStack with a self-managed Kafka cluster for local development and testing of stream-based applications. - -Use this setup to simulate production-like messaging flows, without relying on managed cloud infrastructure. \ No newline at end of file diff --git a/src/content/docs/aws/configuration/web-app/accounts.md b/src/content/docs/aws/organizations-admin/accounts.md similarity index 100% rename from src/content/docs/aws/configuration/web-app/accounts.md rename to src/content/docs/aws/organizations-admin/accounts.md diff --git a/src/content/docs/aws/organizations-admin/index.mdx b/src/content/docs/aws/organizations-admin/index.mdx new file mode 100644 index 000000000..f2903e548 --- /dev/null +++ b/src/content/docs/aws/organizations-admin/index.mdx @@ -0,0 +1,25 @@ +--- +title: Overview +description: Manage your LocalStack accounts, workspaces, users, licenses, and single sign-on through the LocalStack Web Application. +template: doc +editUrl: false +sidebar: + order: 1 +--- + +import SectionCards from '../../../../components/SectionCards.astro'; + +Organizations & Admin covers the administrative side of LocalStack: managing your account, organizing your workspace, and provisioning users, licenses, and permissions through the [LocalStack Web Application](https://app.localstack.cloud/). + +These are generally one-time setup tasks performed by an IT administrator (or by an individual setting up their own account), rather than day-to-day development work. + + diff --git a/src/content/docs/aws/configuration/web-app/managing-users-licenses.md b/src/content/docs/aws/organizations-admin/managing-users-licenses.md similarity index 100% rename from src/content/docs/aws/configuration/web-app/managing-users-licenses.md rename to src/content/docs/aws/organizations-admin/managing-users-licenses.md diff --git a/src/content/docs/aws/enterprise/sso/azure-ad.md b/src/content/docs/aws/organizations-admin/sso/azure-ad.md similarity index 98% rename from src/content/docs/aws/enterprise/sso/azure-ad.md rename to src/content/docs/aws/organizations-admin/sso/azure-ad.md index 2efc9210e..48ed06610 100644 --- a/src/content/docs/aws/enterprise/sso/azure-ad.md +++ b/src/content/docs/aws/organizations-admin/sso/azure-ad.md @@ -2,6 +2,8 @@ title: "SSO for Azure AD" description: Configuring Azure AD for Single Sign-on in LocalStack Enterprise tags: ["Enterprise"] +sidebar: + order: 2 --- To configure SSO with an Azure AD Enterprise application, we provide a simple step-by-step solution below: diff --git a/src/content/docs/aws/enterprise/sso/index.md b/src/content/docs/aws/organizations-admin/sso/index.md similarity index 99% rename from src/content/docs/aws/enterprise/sso/index.md rename to src/content/docs/aws/organizations-admin/sso/index.md index 4999df97a..225dc618b 100644 --- a/src/content/docs/aws/enterprise/sso/index.md +++ b/src/content/docs/aws/organizations-admin/sso/index.md @@ -3,6 +3,8 @@ title: Single-Sign On description: Configuring Custom Single-Sign On (SSO) Providers in LocalStack Web Application. template: doc tags: ["Enterprise"] +sidebar: + order: 1 --- Custom Single-Sign On (SSO) Identity providers, can be enabled to facilitate the process of quickly onboarding team members from your organization. diff --git a/src/content/docs/aws/enterprise/sso/scim.mdx b/src/content/docs/aws/organizations-admin/sso/scim.mdx similarity index 99% rename from src/content/docs/aws/enterprise/sso/scim.mdx rename to src/content/docs/aws/organizations-admin/sso/scim.mdx index 87308b66d..59f919554 100644 --- a/src/content/docs/aws/enterprise/sso/scim.mdx +++ b/src/content/docs/aws/organizations-admin/sso/scim.mdx @@ -3,11 +3,13 @@ title: SCIM User Provisioning description: Automating user and license provisioning in LocalStack using SCIM (System for Cross-domain Identity Management). template: doc tags: ['Enterprise'] +sidebar: + order: 3 --- SCIM (System for Cross-domain Identity Management) allows you to automate user provisioning, deprovisioning, and license assignment in LocalStack through your identity provider (IdP). LocalStack's SCIM implementation follows the SCIM v2.0 specification and has been developed and tested with the Okta SCIM client. -SCIM is a sub-feature of SSO and requires an active SSO configuration with at least one Identity Provider already set up. See the [Single Sign-On](/aws/enterprise/sso/) documentation before proceeding. +SCIM is a sub-feature of SSO and requires an active SSO configuration with at least one Identity Provider already set up. See the [Single Sign-On](/aws/organizations-admin/sso/) documentation before proceeding. All integration details — including the SCIM Base Connector URL, Bearer Auth Token, and group names per subscription — are available in the LocalStack web app under **Settings → [Single Sign-On](https://app.localstack.cloud/settings/sso)**. diff --git a/src/content/docs/aws/configuration/web-app/stack-insights.md b/src/content/docs/aws/organizations-admin/stack-insights.md similarity index 100% rename from src/content/docs/aws/configuration/web-app/stack-insights.md rename to src/content/docs/aws/organizations-admin/stack-insights.md diff --git a/src/content/docs/aws/configuration/web-app/workspaces.md b/src/content/docs/aws/organizations-admin/workspaces.md similarity index 100% rename from src/content/docs/aws/configuration/web-app/workspaces.md rename to src/content/docs/aws/organizations-admin/workspaces.md diff --git a/src/content/docs/aws/services/cloudformation.mdx b/src/content/docs/aws/services/cloudformation.mdx index e4a4b16a7..4e1fd6fe4 100644 --- a/src/content/docs/aws/services/cloudformation.mdx +++ b/src/content/docs/aws/services/cloudformation.mdx @@ -201,7 +201,7 @@ Using [pseudo parameters](#pseudo-parameters) and [intrinsic functions](#intrins Hardcoding `amazonaws.com` (or conversely `localhost.localstack.cloud`) when building service URLs is one of the most common causes of templates that deploy on AWS but fail on LocalStack, or vice versa. This typically shows up in API Gateway invoke URLs, Step Functions API integration targets, and other places where a template constructs a fully qualified endpoint. -The `AWS::URLSuffix` pseudo parameter resolves to `amazonaws.com` on AWS (or `amazonaws.com.cn` in China Regions) and to the configured [`LOCALSTACK_HOST`](/aws/configuration/config/configuration/) on LocalStack, which defaults to `localhost.localstack.cloud`. +The `AWS::URLSuffix` pseudo parameter resolves to `amazonaws.com` on AWS (or `amazonaws.com.cn` in China Regions) and to the configured [`LOCALSTACK_HOST`](/aws/customization/configuration-options/) on LocalStack, which defaults to `localhost.localstack.cloud`. Referencing it lets the same template produce a valid URL in either environment. The following snippet shows the anti-pattern to avoid, where `amazonaws.com` is hardcoded into the output URL. @@ -325,7 +325,7 @@ LocalStack resolves each pseudo parameter to the equivalent value for the local | `AWS::Region` | Yes | The Region of the encompassing resource | Same | | `AWS::StackId` | Yes | The ARN of the stack | Same | | `AWS::StackName` | Yes | The name of the stack | Same | -| `AWS::URLSuffix` | Yes | The configured [`LOCALSTACK_HOST`](/aws/configuration/config/configuration/) (default: `localhost.localstack.cloud`) | `amazonaws.com`, or `amazonaws.com.cn` in China Regions | +| `AWS::URLSuffix` | Yes | The configured [`LOCALSTACK_HOST`](/aws/customization/configuration-options/) (default: `localhost.localstack.cloud`) | `amazonaws.com`, or `amazonaws.com.cn` in China Regions | :::tip Reach for `AWS::URLSuffix` and `AWS::Partition` instead of hardcoding `amazonaws.com` or `arn:aws:...` in templates. diff --git a/src/content/docs/aws/services/cloudfront.mdx b/src/content/docs/aws/services/cloudfront.mdx index 705447748..11c72d621 100644 --- a/src/content/docs/aws/services/cloudfront.mdx +++ b/src/content/docs/aws/services/cloudfront.mdx @@ -48,7 +48,7 @@ curl -k https://$domain/hello.txt :::tip If you wish to use CloudFront on system host, ensure your local DNS setup is correctly configured. -Refer to the section on [System DNS configuration](/aws/configuration/dns-server#system-dns-configuration) for details. +Refer to the section on [System DNS configuration](/aws/customization/networking/dns-server#system-dns-configuration) for details. ::: In the example provided above, be aware that the final command (`curl https://$domain/hello.txt`) might encounter a temporary failure accompanied by a warning message `Could not resolve host`. diff --git a/src/content/docs/aws/services/cognito-idp.mdx b/src/content/docs/aws/services/cognito-idp.mdx index 1ab2bc86d..4d7d30a90 100644 --- a/src/content/docs/aws/services/cognito-idp.mdx +++ b/src/content/docs/aws/services/cognito-idp.mdx @@ -143,7 +143,7 @@ awslocal cognito-idp sign-up \ Once the user is successfully created, a confirmation code will be generated. This code can be found in the LocalStack container logs (as shown below). -Additionally, if you have [SMTP configured](/aws/configuration/config/configuration/#emails), the confirmation code can be optionally sent via email for enhanced convenience and user experience. +Additionally, if you have [SMTP configured](/aws/customization/configuration-options/#emails), the confirmation code can be optionally sent via email for enhanced convenience and user experience. ```bash INFO:localstack_ext.services.cognito.cognito_idp_api: Confirmation code for Cognito user example_user: 125796 @@ -331,7 +331,7 @@ On the next sign-in, the flow returns an `EMAIL_OTP` challenge: } ``` -The one-time code is printed to the LocalStack container logs (and sent via email if [SMTP is configured](/aws/configuration/config/configuration/#emails)): +The one-time code is printed to the LocalStack container logs (and sent via email if [SMTP is configured](/aws/customization/configuration-options/#emails)): ```bash INFO --- [et.reactor-0] l.p.c.s.c.auth_flows : Code verification sent via email: 123456 @@ -518,7 +518,7 @@ The client credentials grant allows for scope-based authorization from a non-int Your app can directly request client credentials from the token endpoint to receive an access token. To request the token from the LocalStack URL, use the following endpoint: `://cognito-idp.localhost.localstack.cloud:4566/_aws/cognito-idp/oauth2/token`. -For additional information on our endpoints, refer to our [Internal Endpoints](/aws/configuration/networking/internal-endpoints/) documentation. +For additional information on our endpoints, refer to our [Internal Endpoints](/aws/customization/networking/internal-endpoints/) documentation. If there are multiple user pools, LocalStack identifies the appropriate one by examining the `clientid` of the request. @@ -652,7 +652,7 @@ The following code snippets and sample applications provide practical examples o By default, LocalStack's Cognito does not send actual email messages. However, if you wish to enable this feature, you will need to provide an email address and configure the corresponding SMTP settings. -The instructions on configuring the connection parameters of your SMTP server can be found in the [Configuration](/aws/configuration/config/configuration/#emails) guide to allow your local Cognito environment to send email notifications. +The instructions on configuring the connection parameters of your SMTP server can be found in the [Configuration](/aws/customization/configuration-options/#emails) guide to allow your local Cognito environment to send email notifications. ## API Coverage (Cognito Identity Pools) diff --git a/src/content/docs/aws/services/docdb.mdx b/src/content/docs/aws/services/docdb.mdx index ab4c9476b..70836955d 100644 --- a/src/content/docs/aws/services/docdb.mdx +++ b/src/content/docs/aws/services/docdb.mdx @@ -212,7 +212,7 @@ the [MongoDB documentation](https://www.mongodb.com/docs/). You need to set `DOCDB_PROXY_CONTAINER=1` when starting LocalStack to be able to use the returned `Endpoint`, which will be correctly resolved automatically. The flag `DOCDB_PROXY_CONTAINER=1` changes the default behavior and the container will be started as proxied container. -Meaning a port from the [pre-defined port](/aws/configuration/networking/external-port-range/) range will be chosen, and when using lambda, you can use `localhost.localstack.cloud` to connect to the instance. +Meaning a port from the [pre-defined port](/aws/customization/networking/external-port-range/) range will be chosen, and when using lambda, you can use `localhost.localstack.cloud` to connect to the instance. ::: In this sample we will use a Node.js lambda function to connect to a DocumentDB. diff --git a/src/content/docs/aws/services/ec2.mdx b/src/content/docs/aws/services/ec2.mdx index 8669631f5..677782fc5 100644 --- a/src/content/docs/aws/services/ec2.mdx +++ b/src/content/docs/aws/services/ec2.mdx @@ -206,7 +206,7 @@ LocalStack EC2 supports multiple methods to simulate the EC2 service. All tiers support the mock/CRUD capability. For advanced setups, LocalStack for AWS comes with emulation capability for certain resource types so that they behave more closely like AWS. -The underlying method for this can be controlled using the [`EC2_VM_MANAGER`](/aws/configuration/config/configuration#ec2) configuration option. +The underlying method for this can be controlled using the [`EC2_VM_MANAGER`](/aws/customization/configuration-options#ec2) configuration option. You may choose between plain mocked resources, containerized or virtualized. ## Mock VM Manager @@ -214,7 +214,7 @@ You may choose between plain mocked resources, containerized or virtualized. With the Mock VM manager, all resources are stored as in-memory representation. This only offers the CRUD capability. -To use this VM manager in LocalStack for AWS, set [`EC2_VM_MANAGER`](/aws/configuration/config/configuration#ec2) to `mock`. +To use this VM manager in LocalStack for AWS, set [`EC2_VM_MANAGER`](/aws/customization/configuration-options#ec2) to `mock`. This serves as the fallback manager if an operation is not implemented in other VM managers. @@ -224,7 +224,7 @@ LocalStack for AWS supports the Docker VM manager which uses the [Docker Engine] This VM manager requires the Docker socket from the host machine to be mounted inside the LocalStack container at `/var/run/docker.sock`. This is the default VM manager in LocalStack for AWS. -You may set [`EC2_VM_MANAGER`](/aws/configuration/config/configuration#ec2) to `docker` to explicitly use this VM manager. +You may set [`EC2_VM_MANAGER`](/aws/customization/configuration-options#ec2) to `docker` to explicitly use this VM manager. All launched EC2 instances have the Docker socket mounted inside them at `/var/run/docker.sock` to make Docker-in-Docker usecases possible. @@ -339,7 +339,7 @@ This section illustrates how this functionality can be achieved with EC2 Docker :::note This feature is disabled by default. -Please set the [`EC2_MOUNT_BLOCK_DEVICES`](/aws/configuration/config/configuration#ec2) configuration option to enable it. +Please set the [`EC2_MOUNT_BLOCK_DEVICES`](/aws/customization/configuration-options#ec2) configuration option to enable it. ::: First, we create a user data script `init.sh` which creates an ext3 file system on the block device `/ebs-dev/sda1` and mounts it under `/ebs-mounted`: @@ -365,7 +365,7 @@ awslocal ec2 run-instances --image-id ami-ff0fea8310f3 --count 1 --instance-type ``` Please note that, whereas real AWS uses GiB for volume sizes, LocalStack uses MiB as the unit for `VolumeSize` in the command above (to avoid creating huge files locally). -Also, by default block device images are limited to 1 GiB in size, but this can be customized by setting the [`EC2_EBS_MAX_VOLUME_SIZE`](/aws/configuration/config/configuration#ec2) config variable (defaults to `1000`). +Also, by default block device images are limited to 1 GiB in size, but this can be customized by setting the [`EC2_EBS_MAX_VOLUME_SIZE`](/aws/customization/configuration-options#ec2) config variable (defaults to `1000`). Once the instance is successfully started and initialized, we can first determine the container ID via `docker ps`, and then list the contents of the mounted filesystem `/ebs-mounted`, which should contain our test file named `my-test-file`: @@ -430,7 +430,7 @@ If you would like support for more metadata categories, please make a feature re ### Configuration -You can use the [`EC2_DOCKER_FLAGS`](/aws/configuration/config/configuration#ec2) LocalStack configuration variable to pass supplementary flags to Docker during the initiation of containerized instances. +You can use the [`EC2_DOCKER_FLAGS`](/aws/customization/configuration-options#ec2) LocalStack configuration variable to pass supplementary flags to Docker during the initiation of containerized instances. This allows for fine-tuned behaviours, for example, running containers in privileged mode using `--privileged` or specifying an alternate CPU platform with `--platform`. Keep in mind that this will apply to all instances that are launched in the LocalStack session. @@ -500,7 +500,7 @@ If you are using [Docker CLI](/aws/getting-started/installation#docker), include -v /var/run/libvirt/libvirt-sock:/var/run/libvirt/libvirt-sock ``` -If you are using a remote Libvirt hypervisor, you can set the [`EC2_HYPERVISOR_URI`](/aws/configuration/config/configuration#ec2) config option with a connection URI. +If you are using a remote Libvirt hypervisor, you can set the [`EC2_HYPERVISOR_URI`](/aws/customization/configuration-options#ec2) config option with a connection URI. :::tip If you encounter an error like `failed to connect to the hypervisor: Permission denied`, you may need to perform additional setup on the hypervisor host. @@ -541,7 +541,7 @@ LocalStack does not come preloaded with any AMIs. Compatible qcow2 images must be placed in the Libvirt storage pool on the host machine. By default, this is located at `/var/lib/libvirt/images`. -If you use a different storage pool, configure it using the [`EC2_LIBVIRT_POOL`](/aws/configuration/config/configuration#ec2) option. +If you use a different storage pool, configure it using the [`EC2_LIBVIRT_POOL`](/aws/customization/configuration-options#ec2) option. Images must be named with the prefix `ami-` followed by at least 8 hexadecimal characters without an extension, e.g. `ami-1234abcd`. You may need run the following command to make sure the image is registered with Libvirt (replace `default` with your storage pool name if different): @@ -615,7 +615,7 @@ The Libvirt VM manager supports several configuration options to customize its b By default, LocalStack creates VMs using a generic Libvirt domain configuration. However, certain hypervisor setups may require specialized configurations that LocalStack cannot automatically detect. -You can use the [`EC2_REFERENCE_DOMAIN`](/aws/configuration/config/configuration#ec2) configuration option to specify a pre-configured Libvirt domain that LocalStack will use as a template for all new instances. +You can use the [`EC2_REFERENCE_DOMAIN`](/aws/customization/configuration-options#ec2) configuration option to specify a pre-configured Libvirt domain that LocalStack will use as a template for all new instances. LocalStack clones the domain configuration, updating elements like UUID, MAC addresses, and boot volumes as needed. To use domain cloning: @@ -631,8 +631,8 @@ If the specified domain does not exist or is not in shut-off state, LocalStack f By default, LocalStack uses the Libvirt storage pool and network named `default`. If your Libvirt setup uses different names, you can configure them using: -- [`EC2_LIBVIRT_POOL`](/aws/configuration/config/configuration#ec2): Name of the Libvirt storage pool for images (defaults to `default`). -- [`EC2_LIBVIRT_NETWORK`](/aws/configuration/config/configuration#ec2): Name of the Libvirt network for instances (defaults to `default`). +- [`EC2_LIBVIRT_POOL`](/aws/customization/configuration-options#ec2): Name of the Libvirt storage pool for images (defaults to `default`). +- [`EC2_LIBVIRT_NETWORK`](/aws/customization/configuration-options#ec2): Name of the Libvirt network for instances (defaults to `default`). ### Networking diff --git a/src/content/docs/aws/services/ecs.mdx b/src/content/docs/aws/services/ecs.mdx index 30a72d88a..1765d42f3 100644 --- a/src/content/docs/aws/services/ecs.mdx +++ b/src/content/docs/aws/services/ecs.mdx @@ -251,7 +251,7 @@ If your ECS containers depend on LocalStack services, your ECS task network shou If you are running LocalStack through a `docker run` command, do not forget to enable the communication from the container to the Docker Engine API. You can provide the access by adding the following option `-v /var/run/docker.sock:/var/run/docker.sock`. -For more information regarding the configuration of LocalStack, please check the [LocalStack configuration](/aws/configuration/config/configuration) section. +For more information regarding the configuration of LocalStack, please check the [LocalStack configuration](/aws/customization/configuration-options) section. ## Remote debugging diff --git a/src/content/docs/aws/services/eks.mdx b/src/content/docs/aws/services/eks.mdx index 661d2730a..38d2a5639 100644 --- a/src/content/docs/aws/services/eks.mdx +++ b/src/content/docs/aws/services/eks.mdx @@ -227,12 +227,12 @@ You can now use ECR (Elastic Container Registry) images within your EKS environm #### Initial configuration -To modify the return value of resource URIs for most services, including ECR, you can utilize the `LOCALSTACK_HOST` variable in the [configuration](/aws/configuration/config/configuration). +To modify the return value of resource URIs for most services, including ECR, you can utilize the `LOCALSTACK_HOST` variable in the [configuration](/aws/customization/configuration-options). By default, ECR returns a `repositoryUri` starting with `localhost.localstack.cloud`, such as: `localhost.localstack.cloud:/`. :::note In this section, we assume that `localhost.localstack.cloud` resolves in your environment, and LocalStack is connected to a non-default bridge network. -For more information, refer to the article about [DNS rebind protection](/aws/configuration/dns-server#dns-rebind-protection). +For more information, refer to the article about [DNS rebind protection](/aws/customization/networking/dns-server#dns-rebind-protection). If the domain `localhost.localstack.cloud` does not resolve on your host, you can still proceed by setting `LOCALSTACK_HOST=localhost` (not recommended). @@ -348,7 +348,7 @@ In the events, we can see that the pull from ECR was successful: ``` :::tip -Public Docker images from `registry.k8s.io` can be pulled without additional configuration from EKS nodes, but if you pull images from any other locations that resolve to S3 you can configure `DNS_NAME_PATTERNS_TO_RESOLVE_UPSTREAM=\.s3.*\.amazonaws\.com` in your [configuration](/aws/configuration/config/configuration). +Public Docker images from `registry.k8s.io` can be pulled without additional configuration from EKS nodes, but if you pull images from any other locations that resolve to S3 you can configure `DNS_NAME_PATTERNS_TO_RESOLVE_UPSTREAM=\.s3.*\.amazonaws\.com` in your [configuration](/aws/customization/configuration-options). ::: ### Configuring an Ingress for your services diff --git a/src/content/docs/aws/services/elasticache.mdx b/src/content/docs/aws/services/elasticache.mdx index c9048ee91..5ae1ed007 100644 --- a/src/content/docs/aws/services/elasticache.mdx +++ b/src/content/docs/aws/services/elasticache.mdx @@ -49,7 +49,7 @@ awslocal elasticache describe-cache-clusters --show-cache-node-info --query "Cac } ``` -The cache cluster uses a random port of the [external service port range](/aws/configuration/networking/external-port-range/). +The cache cluster uses a random port of the [external service port range](/aws/customization/networking/external-port-range/). Use this port number to connect to the Redis instance like so: ```bash diff --git a/src/content/docs/aws/services/emr.mdx b/src/content/docs/aws/services/emr.mdx index bd0a16095..cfcf0779c 100644 --- a/src/content/docs/aws/services/emr.mdx +++ b/src/content/docs/aws/services/emr.mdx @@ -21,7 +21,7 @@ The supported APIs are available on the API coverage section for [EMR](#api-cove :::note To utilize the EMR API, certain additional dependencies need to be downloaded from the network (including Hadoop, Hive, Spark, etc). These dependencies are fetched automatically during service startup, hence it is important to ensure a reliable internet connection when retrieving the dependencies for the first time. -Alternatively, you can use one of our `*-bigdata` Docker image tags which already ship with the required libraries baked in and may provide better stability (see [here](/aws/configuration/config/docker-images/) for more details). +Alternatively, you can use one of our `*-bigdata` Docker image tags which already ship with the required libraries baked in and may provide better stability (see [here](/aws/customization/other-installations/docker-images/) for more details). ::: ## Getting started diff --git a/src/content/docs/aws/services/es.mdx b/src/content/docs/aws/services/es.mdx index e82e9f8d4..8054b430a 100644 --- a/src/content/docs/aws/services/es.mdx +++ b/src/content/docs/aws/services/es.mdx @@ -149,7 +149,7 @@ There are three configurable strategies that govern how domain endpoints are cre | - | - | - | | `domain` | `..es.localhost.localstack.cloud:4566` | This is the default strategy that uses the `localhost.localstack.cloud` domain to route to your localhost | | `path` | `localhost:4566/es//` | An alternative that can be useful if you cannot resolve LocalStack's localhost domain | -| `port` | `localhost:` | Exposes the cluster(s) directly with ports from the [external service port range](/aws/configuration/networking/external-port-range/)| +| `port` | `localhost:` | Exposes the cluster(s) directly with ports from the [external service port range](/aws/customization/networking/external-port-range/)| | `off` | | *Deprecated*. This value now reverts to the `port` setting, using a port from the given range instead of `4571` | Regardless of the service from which the clusters were created, the domain of the cluster always corresponds to the engine type (OpenSearch or Elasticsearch) of the cluster. diff --git a/src/content/docs/aws/services/lambda.mdx b/src/content/docs/aws/services/lambda.mdx index 22e86312b..df73abc57 100644 --- a/src/content/docs/aws/services/lambda.mdx +++ b/src/content/docs/aws/services/lambda.mdx @@ -526,7 +526,7 @@ This init binary is used as the entry point for every Lambda container. Our custom implementation offers additional configuration options, but these configurations are primarily intended for LocalStack developers and could change in the future. -The LocalStack [configuration](/aws/configuration/config/configuration) `LAMBDA_DOCKER_FLAGS` can be used to configure all Lambda containers, +The LocalStack [configuration](/aws/customization/configuration-options) `LAMBDA_DOCKER_FLAGS` can be used to configure all Lambda containers, for example `LAMBDA_DOCKER_FLAGS=-e LOCALSTACK_INIT_LOG_LEVEL=debug`. Some noteworthy configurations include: - `LOCALSTACK_INIT_LOG_LEVEL` defines the log level of the Golang binary. @@ -602,7 +602,7 @@ With the new implementation, the following changes have been introduced: The ARM containers for compatible runtimes are based on Amazon Linux 2, and ARM-compatible hosts can create functions with the `arm64` architecture. - Lambda functions in LocalStack resolve AWS domains, such as `s3.amazonaws.com`, to the LocalStack container. This domain resolution is DNS-based and can be disabled by setting `DNS_ADDRESS=0`. - For more information, refer to [Transparent Endpoint Injection](/aws/configuration/networking/transparent-endpoint-injection). + For more information, refer to [Transparent Endpoint Injection](/aws/customization/networking/transparent-endpoint-injection). Previously, LocalStack provided patched AWS SDKs to redirect AWS API calls transparently to LocalStack. - The new provider may generate more exceptions due to invalid input. For instance, while the old provider accepted arbitrary strings (such as `r1`) as Lambda roles when creating a function, the new provider validates role ARNs using a regular expression that requires them to be in the format `arn:aws:iam::000000000000:role/lambda-role`. @@ -613,7 +613,7 @@ With the new implementation, the following changes have been introduced: The configuration `LAMBDA_SYNCHRONOUS_CREATE=1` can force synchronous function creation, but it is not recommended. - LocalStack's Lambda implementation, allows you to customize the Lambda execution environment using the [Lambda Extensions API](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-extensions-api.html). This API allows for advanced monitoring, observability, or developer tooling, providing greater control and flexibility over your Lambda functions. - Lambda functions can also be run on hosts with [multi-architecture support](/aws/configuration/config/arm64-support/), allowing you to leverage LocalStack's Lambda API to develop and test Lambda functions with high parity. + Lambda functions can also be run on hosts with [multi-architecture support](/aws/customization/advanced/arm64-support/), allowing you to leverage LocalStack's Lambda API to develop and test Lambda functions with high parity. The following configuration options from the old provider are discontinued in the new provider: diff --git a/src/content/docs/aws/services/memorydb.mdx b/src/content/docs/aws/services/memorydb.mdx index 8be90ee9b..d3c2af060 100644 --- a/src/content/docs/aws/services/memorydb.mdx +++ b/src/content/docs/aws/services/memorydb.mdx @@ -48,7 +48,7 @@ awslocal memorydb describe-clusters --query "Clusters[0].ClusterEndpoint" } ``` -The cache cluster uses a random port of the [external service port range](/aws/configuration/networking/external-port-range/) in regular execution and a port between 36739 and 46738 in container mode. +The cache cluster uses a random port of the [external service port range](/aws/customization/networking/external-port-range/) in regular execution and a port between 36739 and 46738 in container mode. Use this port number to connect to the Redis instance using the `redis-cli` command line tool: ```bash diff --git a/src/content/docs/aws/services/mwaa.mdx b/src/content/docs/aws/services/mwaa.mdx index c11024410..19a010811 100644 --- a/src/content/docs/aws/services/mwaa.mdx +++ b/src/content/docs/aws/services/mwaa.mdx @@ -101,7 +101,7 @@ awslocal s3 cp sample_dag.py s3://my-mwaa-bucket/dags ``` LocalStack syncs new and changed objects in the S3 bucket to the Airflow container every 30 seconds. -The polling interval can be changed using the [`MWAA_S3_POLL_INTERVAL`](/aws/configuration/config/configuration/#mwaa) config option. +The polling interval can be changed using the [`MWAA_S3_POLL_INTERVAL`](/aws/customization/configuration-options/#mwaa) config option. ## Installing custom plugins diff --git a/src/content/docs/aws/services/neptune.mdx b/src/content/docs/aws/services/neptune.mdx index 81134bc6f..495ea9926 100644 --- a/src/content/docs/aws/services/neptune.mdx +++ b/src/content/docs/aws/services/neptune.mdx @@ -223,7 +223,7 @@ awscurl "https://localhost.localstack.cloud:4510/gremlin?gremlin=g.V().count()" :::note If Gremlin Server is installed in your LocalStack environment, you must delete it and restart LocalStack. -You can find your LocalStack volume location on the [LocalStack filesystem documentation](/aws/configuration/config/filesystem/#localstack-volume). +You can find your LocalStack volume location on the [LocalStack filesystem documentation](/aws/customization/advanced/filesystem/#localstack-volume). ```bash rm -rf /lib/tinkerpop diff --git a/src/content/docs/aws/services/opensearch.mdx b/src/content/docs/aws/services/opensearch.mdx index 94373cae0..6dfea6f99 100644 --- a/src/content/docs/aws/services/opensearch.mdx +++ b/src/content/docs/aws/services/opensearch.mdx @@ -114,7 +114,7 @@ The strategy can be configured via the `OPENSEARCH_ENDPOINT_STRATEGY` environmen | ------- | ----------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | | `domain` | `...localhost.localstack.cloud:4566` | The default strategy employing the `localhost.localstack.cloud` domain for routing to localhost. | | `path` | `localhost:4566///` | An alternative strategy useful if resolving LocalStack's localhost domain poses difficulties. | -| `port` | `localhost:` | Directly exposes cluster(s) via ports from [the external service port range](/aws/configuration/networking/external-port-range/). | +| `port` | `localhost:` | Directly exposes cluster(s) via ports from [the external service port range](/aws/customization/networking/external-port-range/). | Irrespective of the originating service for the clusters, the domain of each cluster consistently aligns with its engine type, be it OpenSearch or Elasticsearch. Consequently, OpenSearch clusters incorporate `opensearch` within their domains (e.g., `my-domain.us-east-1.opensearch.localhost.localstack.cloud:4566`), while Elasticsearch clusters feature `es` in their domains (e.g., `my-domain.us-east-1.es.localhost.localstack.cloud:4566`). @@ -241,7 +241,7 @@ When using OpenSearch Dashboards with LocalStack, you need to make sure to: - Enable the [advanced security options](#advanced-security-options) and set a username and a password. This is required by OpenSearch Dashboards. - Ensure that the OpenSearch Dashboards Docker container uses the LocalStack DNS. - You can find more information on how to connect your Docker container to Localstack in our [Network Troubleshooting guide](/aws/configuration/networking/). + You can find more information on how to connect your Docker container to Localstack in our [Network Troubleshooting guide](/aws/customization/networking/). First, you need to make sure to start LocalStack in a specific Docker network: @@ -396,7 +396,7 @@ The `CustomEndpointOptions` in LocalStack offers the flexibility to utilize arbi ## Troubleshooting If you encounter difficulties resolving subdomains while employing the `OPENSEARCH_ENDPOINT_STRATEGY=domain` (the default setting), it's advisable to investigate whether your DNS configuration might be obstructing rebind queries. -For further insights on addressing this issue, refer to the section on [DNS rebind protection](/aws/configuration/dns-server#dns-rebind-protection). +For further insights on addressing this issue, refer to the section on [DNS rebind protection](/aws/customization/networking/dns-server#dns-rebind-protection). ## API Coverage diff --git a/src/content/docs/aws/services/organizations.mdx b/src/content/docs/aws/services/organizations.mdx index 07474f8d8..d1ea226c1 100644 --- a/src/content/docs/aws/services/organizations.mdx +++ b/src/content/docs/aws/services/organizations.mdx @@ -12,7 +12,7 @@ Amazon Web Services Organizations is an account management service that allows y It allows you to manage different accounts in a single organization and consolidate billing. With Organizations, you can also attach different policies to your organizational units (OUs) or individual accounts in your organization. -Organizations is available over LocalStack for AWS and the supported APIs are available over our [configuration page](/aws/configuration/config/configuration). +Organizations is available over LocalStack for AWS and the supported APIs are available over our [configuration page](/aws/customization/configuration-options). ## Getting started @@ -157,6 +157,44 @@ As a result, the simulator reflects the real AWS IAM behavior rather than the be - AWS reports an explicit `Deny` from an SCP as an implicit deny. LocalStack reports it as an explicit deny, which is the expected outcome. ::: +## Service Control Policy validation + +When you create or update a Service Control Policy (SCP) with `CreatePolicy` or `UpdatePolicy`, LocalStack validates the policy document against the syntax rules that SCPs must follow. +A policy that violates any of these rules is rejected with a `MalformedPolicyDocumentException` or a `ConstraintViolationException`, matching the behavior you would see on AWS. + +The following constraints are enforced for SCPs: + +- **No `Principal` or `NotPrincipal` elements**: unlike identity-based or resource-based IAM policies, SCPs cannot specify a `Principal` or `NotPrincipal` key inside a `Statement`. A policy that includes either key is rejected with a `MalformedPolicyDocumentException`. +- **Maximum policy size of 10,240 characters**: a policy document larger than 10,240 characters is rejected with a `ConstraintViolationException` (reason `POLICY_CONTENT_LIMIT_EXCEEDED`). This matches the limit enforced by AWS in practice. +- **A single policy object**: the document must be a single JSON object. Passing a JSON array of policy objects is rejected. +- **A single `Statement` key**: the document may contain only one `Statement` key. Duplicate `Statement` keys (or any other duplicate keys) cause the policy to be rejected as malformed. +- **Resources must be present**: each statement must contain a `Resource` element. Specific resource ARNs (not just the `*` wildcard) are accepted. + +:::note +The AWS documentation states that the [maximum SCP size is 5,120 characters](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_reference_limits.html) and that SCPs [only support the `*` wildcard for resources](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps_syntax.html#scp-syntax-resource). +LocalStack instead mirrors the behavior observed against real AWS: the enforced size limit is 10,240 characters, and specific resource ARNs are accepted. +::: + +For example, the following policy is rejected because it includes a `Principal` element, which is not permitted in an SCP: + +```bash +awslocal organizations create-policy \ + --name "InvalidSCP" \ + --description "SCP with a Principal element" \ + --type SERVICE_CONTROL_POLICY \ + --content '{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Deny", + "Principal": "*", + "Action": "s3:*", + "Resource": "*" + } + ] + }' +``` + ## API Coverage diff --git a/src/content/docs/aws/services/route53.mdx b/src/content/docs/aws/services/route53.mdx index 9d90a23b3..588ed5f6c 100644 --- a/src/content/docs/aws/services/route53.mdx +++ b/src/content/docs/aws/services/route53.mdx @@ -198,10 +198,10 @@ For ELB alias records: ## DNS resolution -LocalStack for AWS supports the ability to respond to DNS queries for your Route53 domain names, with our [integrated DNS server](/aws/configuration/dns-server). +LocalStack for AWS supports the ability to respond to DNS queries for your Route53 domain names, with our [integrated DNS server](/aws/customization/networking/dns-server). :::note -To follow the example below you must [configure your system DNS to use the LocalStack DNS server](/aws/configuration/dns-server#system-dns-configuration). +To follow the example below you must [configure your system DNS to use the LocalStack DNS server](/aws/customization/networking/dns-server#system-dns-configuration). ::: ### Query a DNS record @@ -224,7 +224,7 @@ test.example.com. 300 IN A 1.2.3.4 The DNS name `localhost.localstack.cloud`, along with its subdomains like `mybucket.s3.localhost.localstack.cloud`, serves an internal routing purpose within LocalStack. It facilitates communication between a LocalStack compute environment (such as a Lambda function) and the LocalStack APIs, as well as your containerised applications with the LocalStack APIs. -For example configurations, see the [Network Troubleshooting guide](/aws/configuration/networking/). +For example configurations, see the [Network Troubleshooting guide](/aws/customization/networking/). For most use-cases, the default configuration of the internal LocalStack DNS name requires no modification. It functions seamlessly in typical scenarios. diff --git a/src/content/docs/aws/services/s3.mdx b/src/content/docs/aws/services/s3.mdx index d5400e6c3..c3cb15372 100644 --- a/src/content/docs/aws/services/s3.mdx +++ b/src/content/docs/aws/services/s3.mdx @@ -143,7 +143,7 @@ By default, most SDKs will try to use **Virtual-Hosted style** requests and prep However, if the endpoint is not prefixed by `s3.`, LocalStack will not be able to understand the request and it will most likely result in an error. You can either change the endpoint to an S3-specific one, or configure your SDK to use **Path style** requests instead. -Check out our [SDK documentation](/aws/configuration/localstack-sdks/) to learn how you can configure AWS SDKs to access LocalStack and S3. +Check out our [SDK documentation](/aws/customization/integrations/localstack-sdks/) to learn how you can configure AWS SDKs to access LocalStack and S3. :::tip While using [AWS SDKs](https://aws.amazon.com/developer/tools/#SDKs), you would need to configure the `ForcePathStyle` parameter to `true` in the S3 client configuration to use **Path style** requests. diff --git a/src/content/docs/aws/services/ses.mdx b/src/content/docs/aws/services/ses.mdx index ce422de2e..9bce3bec9 100644 --- a/src/content/docs/aws/services/ses.mdx +++ b/src/content/docs/aws/services/ses.mdx @@ -110,14 +110,14 @@ Sent messages can be retrieved in following ways: ```bash curl -X DELETE localhost.localstack.cloud:4566/_aws/ses?id=dqxhhgoutkmylpbc-ffuqlkjs-ljld-fckp-hcph-wcsrkmxhhldk-pvadjc ``` -- **Filesystem:** All messages are saved to the state directory (see [filesystem layout](/aws/configuration/config/filesystem)). +- **Filesystem:** All messages are saved to the state directory (see [filesystem layout](/aws/customization/advanced/filesystem)). The files are saved as JSON in the `ses/` subdirectory and named by the message ID. ## SMTP Integration LocalStack for AWS supports sending emails via an SMTP server. To enable this, set the connections parameters and access credentials for the server in the configuration. -Refer to the [Configuration](/aws/configuration/config/configuration/#emails) guide for details. +Refer to the [Configuration](/aws/customization/configuration-options/#emails) guide for details. :::tip If you do not have access to a live SMTP server, you can use tools like [MailDev](https://github.com/maildev/maildev) or [smtp4dev](https://github.com/rnwood/smtp4dev). diff --git a/src/content/docs/aws/services/sqs.mdx b/src/content/docs/aws/services/sqs.mdx index 126432221..d8e4babd2 100644 --- a/src/content/docs/aws/services/sqs.mdx +++ b/src/content/docs/aws/services/sqs.mdx @@ -373,7 +373,7 @@ Our Lambda implementation automatically resolves these URLs to the LocalStack co When your code run within different containers like ECS tasks or your custom ones, it's advisable to establish your Docker network setup. You can follow these steps: -1. Override the `LOCALSTACK_HOST` variable as outlined in our [network troubleshooting guide](/aws/configuration/networking/). +1. Override the `LOCALSTACK_HOST` variable as outlined in our [network troubleshooting guide](/aws/customization/networking/). 2. Ensure that your containers can resolve `LOCALSTACK_HOST` to the LocalStack container within the Docker network. 3. We recommend employing `SQS_ENDPOINT_STRATEGY=path`, which generates queue URLs in the format `http:///queue/...`. diff --git a/src/content/docs/aws/services/transcribe.mdx b/src/content/docs/aws/services/transcribe.mdx index 29563ca5d..02d02a1f4 100644 --- a/src/content/docs/aws/services/transcribe.mdx +++ b/src/content/docs/aws/services/transcribe.mdx @@ -18,7 +18,7 @@ The supported APIs are available on our [API Coverage section](#api-coverage), w LocalStack Transcribe uses an offline speech-to-text library called [Vosk](https://alphacephei.com/vosk/). It requires an active internet connection to download the language model. Once the language model is downloaded, subsequent transcriptions for the same language can be performed offline. -Language models typically have a size of around 50 MiB and are saved in the cache directory (see [Filesystem Layout](/aws/configuration/config/filesystem)). +Language models typically have a size of around 50 MiB and are saved in the cache directory (see [Filesystem Layout](/aws/customization/advanced/filesystem)). ## Getting Started diff --git a/src/content/docs/aws/tutorials/elb-load-balancing.mdx b/src/content/docs/aws/tutorials/elb-load-balancing.mdx index 3ac70eb20..801c70386 100644 --- a/src/content/docs/aws/tutorials/elb-load-balancing.mdx +++ b/src/content/docs/aws/tutorials/elb-load-balancing.mdx @@ -425,4 +425,4 @@ In this tutorial, we have learned how to create an Application Load Balancer (AL We have also explored creating, configuring, and deploying a Serverless project with LocalStack, enabling developers to develop and test Cloud and Serverless applications locally without AWS costs—accelerating iteration for cloud-native workloads. -LocalStack for AWS offers integrations with various popular tools such as Terraform, Pulumi, Serverless Application Model (SAM), and more. For more information about integrations, you can refer to our [Integrations documentation](https://docs.localstack.cloud/aws/integrations). To further explore and experiment with the concepts covered in this tutorial, you can access the code and resources on our [`localstack-pro-samples` repository on GitHub](https://github.com/localstack/localstack-pro-samples/tree/master/elb-load-balancing) along with a Makefile for step-by-step execution. +LocalStack for AWS offers integrations with various popular tools such as Terraform, Pulumi, Serverless Application Model (SAM), and more. For more information about integrations, you can refer to our [Integrations documentation](https://docs.localstack.cloud/aws/customization/integrations). To further explore and experiment with the concepts covered in this tutorial, you can access the code and resources on our [`localstack-pro-samples` repository on GitHub](https://github.com/localstack/localstack-pro-samples/tree/master/elb-load-balancing) along with a Makefile for step-by-step execution. diff --git a/src/content/docs/aws/tutorials/lambda-ecr-container-images.mdx b/src/content/docs/aws/tutorials/lambda-ecr-container-images.mdx index 35a268cce..cbb4af4a7 100644 --- a/src/content/docs/aws/tutorials/lambda-ecr-container-images.mdx +++ b/src/content/docs/aws/tutorials/lambda-ecr-container-images.mdx @@ -189,7 +189,7 @@ Run the following command to create the function: :::note Before creating the lambda function, please double check under which architecture you have built your image. If your image is built as arm64, you need to specify the lambda architecture when deploying or set `LAMBDA_IGNORE_ARCHITECTURE=1` when starting LocalStack. -More information can be found [in our documentation regarding ARM support.](/aws/configuration/config/arm64-support) +More information can be found [in our documentation regarding ARM support.](/aws/customization/advanced/arm64-support) ::: ```bash diff --git a/src/content/docs/aws/tutorials/route-53-failover.mdx b/src/content/docs/aws/tutorials/route-53-failover.mdx index 51fe3a40b..657752293 100644 --- a/src/content/docs/aws/tutorials/route-53-failover.mdx +++ b/src/content/docs/aws/tutorials/route-53-failover.mdx @@ -62,7 +62,7 @@ The following diagram shows the architecture that this application builds and de ### Creating the resources To begin, deploy the same services in both `us-west-1` and `us-east-1` regions. -The resources specified in the `init-resources.sh` file will be created when the LocalStack container starts, using [Initialization Hooks](/aws/configuration/config/initialization-hooks) and the `awslocal` CLI tool. +The resources specified in the `init-resources.sh` file will be created when the LocalStack container starts, using [Initialization Hooks](/aws/customization/advanced/initialization-hooks) and the `awslocal` CLI tool. The objective is to have a backup system in case of a regional outage in the primary availability zone (`us-west-1`). We'll focus on this region to examine the existing resilience mechanisms. diff --git a/src/content/docs/aws/tutorials/using-terraform-with-testcontainers-and-localstack.mdx b/src/content/docs/aws/tutorials/using-terraform-with-testcontainers-and-localstack.mdx index 7d6c3ad12..8cffa603c 100644 --- a/src/content/docs/aws/tutorials/using-terraform-with-testcontainers-and-localstack.mdx +++ b/src/content/docs/aws/tutorials/using-terraform-with-testcontainers-and-localstack.mdx @@ -22,7 +22,7 @@ leadimage: "terraform-init-hooks.png" LocalStack is a robust tool that emulates a local AWS cloud stack, allowing engineers to test and develop apps using AWS services directly on their local environments. This tool is essential for enhancing developer experience, reducing development costs and increasing efficiency. -In LocalStack, [**initialization hooks**](/aws/configuration/config/initialization-hooks) are scripts that customize or initialize your LocalStack instance at different stages of its lifecycle. +In LocalStack, [**initialization hooks**](/aws/customization/advanced/initialization-hooks) are scripts that customize or initialize your LocalStack instance at different stages of its lifecycle. Up until now, the supported hooks could be shell or Python scripts executed at predefined lifecycle phases — BOOT, START, READY, and SHUTDOWN. By placing scripts in the respective directories (`/etc/localstack/init/{stage}.d`), developers can automate tasks like setting up initial states, configuring services, or performing clean-up activities. @@ -80,7 +80,7 @@ localstack start -e EXTENSION_AUTO_INSTALL=localstack-extension-terraform-init \ ``` This is the easiest way to quickly spin up the desired services at startup. -The command starts LocalStack with the configuration to automatically install the **`localstack-extension-terraform-init`** [extension](/aws/configuration/extensions/) and +The command starts LocalStack with the configuration to automatically install the **`localstack-extension-terraform-init`** [extension](/aws/customization/integrations/extensions/) and mount the necessary files into the container: the Terraform configuration file and the Lambda JAR file. The extension will install both `terraform` and `tflocal` into your LocalStack container, and enable the init hook runners to detect Terraform files. You can also organize your Terraform files into subdirectories if you want. @@ -121,7 +121,7 @@ services: Environment Variables: - **LOCALSTACK_AUTH_TOKEN**: Required for using LocalStack for AWS. - **DEBUG**: Set to 1 to enable verbose logging of the container. -- **EXTENSION_AUTO_INSTALL**: Automatically installs specified LocalStack [extensions](/aws/configuration/extensions/), in this case, `localstack-extension-terraform-init` which allows Terraform files to be directly used as init hooks. +- **EXTENSION_AUTO_INSTALL**: Automatically installs specified LocalStack [extensions](/aws/customization/integrations/extensions/), in this case, `localstack-extension-terraform-init` which allows Terraform files to be directly used as init hooks. Volumes: - Docker Socket: Mounts the Docker socket `/var/run/docker.sock` from the host into the container. diff --git a/src/content/docs/azure/getting-started/auth-token.mdx b/src/content/docs/azure/getting-started/auth-token.mdx index 8a2f3ae58..d57144020 100644 --- a/src/content/docs/azure/getting-started/auth-token.mdx +++ b/src/content/docs/azure/getting-started/auth-token.mdx @@ -68,7 +68,7 @@ If you do not assign a license, the Azure emulator will not start even if you ha ::: To view your own assigned license, visit the [My License page](https://app.localstack.cloud/workspace/my-license). -For more details on inviting users, assigning licenses, or managing roles, see [Users and Licenses](/aws/configuration/web-app/managing-users-licenses/). +For more details on inviting users, assigning licenses, or managing roles, see [Users and Licenses](/aws/organizations-admin/managing-users-licenses/). ## Configuring your Auth Token @@ -147,7 +147,7 @@ Developer Auth Tokens cannot be used in CI. CI Auth Tokens are available on the [Auth Tokens page](https://app.localstack.cloud/workspace/auth-tokens) and are configured similarly to Developer Auth Tokens. To set the CI Auth Token, add the Auth Token value in the `LOCALSTACK_AUTH_TOKEN` environment variable of your CI provider, and reference it when starting the Azure emulator in your CI workflow. -The same patterns used for [LocalStack in CI](/aws/integrations/continuous-integration/) apply to Azure — swap the image for `localstack/localstack-azure`. +The same patterns used for [LocalStack in CI](/aws/ci-pipelines/) apply to Azure — swap the image for `localstack/localstack-azure`. ## Rotating the Auth Token diff --git a/src/content/docs/snowflake/getting-started/auth-token.mdx b/src/content/docs/snowflake/getting-started/auth-token.mdx index 569bf5863..3ea3f1c9a 100644 --- a/src/content/docs/snowflake/getting-started/auth-token.mdx +++ b/src/content/docs/snowflake/getting-started/auth-token.mdx @@ -59,7 +59,7 @@ If you do not assign a license, the Snowflake emulator will not start even if yo ::: To view your own assigned license, visit the [My License page](https://app.localstack.cloud/workspace/my-license). -For more details on inviting users, assigning licenses, or managing roles, see [Users and Licenses](/aws/configuration/web-app/managing-users-licenses/). +For more details on inviting users, assigning licenses, or managing roles, see [Users and Licenses](/aws/organizations-admin/managing-users-licenses/). ## Configuring your Auth Token @@ -139,7 +139,7 @@ Developer Auth Tokens cannot be used in CI. CI Auth Tokens are available on the [Auth Tokens page](https://app.localstack.cloud/workspace/auth-tokens) and are configured similarly to Developer Auth Tokens. To set the CI Auth Token, add the Auth Token value in the `LOCALSTACK_AUTH_TOKEN` environment variable of your CI provider, and reference it when starting the Snowflake emulator in your CI workflow. -The same patterns used for [LocalStack in CI](/aws/integrations/continuous-integration/) apply to Snowflake. +The same patterns used for [LocalStack in CI](/aws/ci-pipelines/) apply to Snowflake. ## Rotating the Auth Token diff --git a/src/data/licensing/current-plans.json b/src/data/licensing/current-plans.json index 9071060b9..229af5ac7 100644 --- a/src/data/licensing/current-plans.json +++ b/src/data/licensing/current-plans.json @@ -677,7 +677,7 @@ }, { "name": "Extensions", - "docsUrl": "/aws/configuration/extensions/", + "docsUrl": "/aws/customization/integrations/extensions/", "plans": { "Hobby": true, "Base": true, @@ -801,7 +801,7 @@ }, { "name": "Telemetry Sharing", - "docsUrl": "/aws/configuration/config/usage-tracking/", + "docsUrl": "/aws/customization/advanced/usage-tracking/", "plans": { "Hobby": "enforced", "Base": "default on", diff --git a/src/styles/custom.css b/src/styles/custom.css index 6a7e86e07..6c051a1d0 100644 --- a/src/styles/custom.css +++ b/src/styles/custom.css @@ -102,6 +102,19 @@ vertical-align: middle; } +.users-icon::before { + content: ""; + display: inline-block; + width: 16px; + height: 16px; + background-image: url('/src/assets/images/users.svg'); + background-size: contain; + background-repeat: no-repeat; + background-position: center; + margin-right: 6px; + vertical-align: middle; +} + .book-icon::before { content: ""; display: inline-block; From c9d80db000314f2055d5657022973cdc2c191154 Mon Sep 17 00:00:00 2001 From: Quetzalli Date: Wed, 8 Jul 2026 11:35:53 +0200 Subject: [PATCH 57/58] =?UTF-8?q?DOCS-345=20(`hotfix`):=20Point=20sign-up?= =?UTF-8?q?=20links=20to=20marketing=20pricing=20page=20(#=E2=80=A6=20(#76?= =?UTF-8?q?9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Simon Wallner Co-authored-by: Claude Opus 4.8 (1M context) --- src/content/docs/aws/connecting/ides/vscode-extension.md | 2 +- .../docs/aws/developer-tools/lambda-tools/remote-debugging.mdx | 2 +- .../docs/aws/developer-tools/running-localstack/lstk.mdx | 2 +- src/content/docs/aws/getting-started/auth-token.mdx | 2 +- src/content/docs/aws/getting-started/quickstart.mdx | 2 +- .../docs/aws/tutorials/aws-proxy-localstack-extension.mdx | 2 +- src/content/docs/aws/tutorials/iam-policy-stream.mdx | 2 +- src/content/docs/azure/getting-started/auth-token.mdx | 2 +- src/content/docs/snowflake/getting-started/auth-token.mdx | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/content/docs/aws/connecting/ides/vscode-extension.md b/src/content/docs/aws/connecting/ides/vscode-extension.md index 0cdb09d53..df6151523 100644 --- a/src/content/docs/aws/connecting/ides/vscode-extension.md +++ b/src/content/docs/aws/connecting/ides/vscode-extension.md @@ -21,7 +21,7 @@ The setup wizard ensures LocalStack is installed and configured for a seamless i LocalStack can be installed either locally for the current user or globally for all users. -You can [start using LocalStack for free by signing up for a free account](https://app.localstack.cloud/sign-up?plan=free) or signing into an existing one. The setup wizard facilitates this process and configures your authentication token required to start LocalStack. +You can [start using LocalStack for free by signing up for a free account](https://www.localstack.cloud/pricing) or signing into an existing one. The setup wizard facilitates this process and configures your authentication token required to start LocalStack. The LocalStack Toolkit integrates seamlessly with AWS tools like the [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html). It automatically configures a dedicated `localstack` AWS profile in your `.aws/config` and `.aws/credentials` files, if one is not already present. diff --git a/src/content/docs/aws/developer-tools/lambda-tools/remote-debugging.mdx b/src/content/docs/aws/developer-tools/lambda-tools/remote-debugging.mdx index f04980338..cad8e99c8 100644 --- a/src/content/docs/aws/developer-tools/lambda-tools/remote-debugging.mdx +++ b/src/content/docs/aws/developer-tools/lambda-tools/remote-debugging.mdx @@ -47,7 +47,7 @@ This guide describes how to use the AWS Toolkit for VS Code to debug Lambda func * [AWS Toolkit for VS Code](https://marketplace.visualstudio.com/items?itemName=AmazonWebServices.aws-toolkit-vscode) (>= v3.74) * [LocalStack Toolkit for VS Code](https://marketplace.visualstudio.com/items?itemName=LocalStack.localstack) (>= v1.2.0) * [Docker](https://www.docker.com/) -* A valid LocalStack Auth Token. Sign up for a [free LocalStack account](https://app.localstack.cloud/sign-up). +* A valid LocalStack Auth Token. Sign up for a [free LocalStack account](https://www.localstack.cloud/pricing). * A valid **auth token** * VS Code running on the **same machine** as LocalStack (container-based setups like Kubernetes are not yet supported). diff --git a/src/content/docs/aws/developer-tools/running-localstack/lstk.mdx b/src/content/docs/aws/developer-tools/running-localstack/lstk.mdx index 9e04183cf..1287d737c 100644 --- a/src/content/docs/aws/developer-tools/running-localstack/lstk.mdx +++ b/src/content/docs/aws/developer-tools/running-localstack/lstk.mdx @@ -25,7 +25,7 @@ Running `lstk` with no arguments takes you through the entire startup flow autom ## Prerequisites - [Docker](https://docs.docker.com/get-docker/) installed and running. -- A [LocalStack account](https://app.localstack.cloud/sign-up) with a [license](/aws/getting-started/auth-token/#managing-your-license), and `lstk` handles authentication for you (see [Authentication](#authentication)). +- A [LocalStack account](https://www.localstack.cloud/pricing) with a [license](/aws/getting-started/auth-token/#managing-your-license), and `lstk` handles authentication for you (see [Authentication](#authentication)). ## Installation diff --git a/src/content/docs/aws/getting-started/auth-token.mdx b/src/content/docs/aws/getting-started/auth-token.mdx index 9b105b903..8a14e258c 100644 --- a/src/content/docs/aws/getting-started/auth-token.mdx +++ b/src/content/docs/aws/getting-started/auth-token.mdx @@ -34,7 +34,7 @@ Both the **Developer Auth Token** and **CI Auth Token** can be managed on the [A ## Managing your License To use LocalStack, a license is required. -You can get a license by registering on the [LocalStack Web Application](https://app.localstack.cloud/sign-up). +You can get a license by [signing up for a free LocalStack account](https://www.localstack.cloud/pricing). Choose between a 14-day trial or explore additional features with our paid offering. During the trial period, you are welcome to use all the features of LocalStack. diff --git a/src/content/docs/aws/getting-started/quickstart.mdx b/src/content/docs/aws/getting-started/quickstart.mdx index 25b21f6c2..d512d8bfb 100644 --- a/src/content/docs/aws/getting-started/quickstart.mdx +++ b/src/content/docs/aws/getting-started/quickstart.mdx @@ -39,7 +39,7 @@ An internal SES LocalStack testing endpoint (`/_localstack/aws/ses`) is configur ## Prerequisites - [LocalStack CLI](/aws/getting-started/installation/#installing-localstack-cli) -- [LocalStack Web Application account](https://app.localstack.cloud/sign-up) & [Auth Token](/aws/getting-started/auth-token/) +- [LocalStack account](https://www.localstack.cloud/pricing) & [Auth Token](/aws/getting-started/auth-token/) - [Docker](https://docs.docker.com/get-docker/) - [Python 3.11+](https://www.python.org/downloads/) & `pip` - [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) & [`awslocal` wrapper](/aws/connecting/aws-cli/#localstack-aws-cli-awslocal) diff --git a/src/content/docs/aws/tutorials/aws-proxy-localstack-extension.mdx b/src/content/docs/aws/tutorials/aws-proxy-localstack-extension.mdx index bb6f13ab4..43f312102 100644 --- a/src/content/docs/aws/tutorials/aws-proxy-localstack-extension.mdx +++ b/src/content/docs/aws/tutorials/aws-proxy-localstack-extension.mdx @@ -32,7 +32,7 @@ In this tutorial, you will learn how to install the AWS Cloud Proxy extension an - [LocalStack CLI](/aws/getting-started/installation#localstack-cli) with [`LOCALSTACK_AUTH_TOKEN`](/aws/getting-started/auth-token) - [Docker](https://docs.docker.com/) - [AWS CLI](https://docs.aws.amazon.com/cli/v1/userguide/cli-chap-install.html) with [`awslocal` wrapper](https://github.com/localstack/awscli-local) -- [LocalStack Web Application account](https://app.localstack.cloud/sign-up) +- [LocalStack account](https://www.localstack.cloud/pricing) - [AWS Account](https://aws.amazon.com/) with an [`AWS_ACCESS_KEY_ID` & `AWS_SECRET_ACCESS_KEY`](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_CreateAccessKey) ## Install the AWS Cloud Proxy extension diff --git a/src/content/docs/aws/tutorials/iam-policy-stream.mdx b/src/content/docs/aws/tutorials/iam-policy-stream.mdx index cf3ffa3f8..55e155afe 100644 --- a/src/content/docs/aws/tutorials/iam-policy-stream.mdx +++ b/src/content/docs/aws/tutorials/iam-policy-stream.mdx @@ -45,7 +45,7 @@ Additionally, it serves as a useful learning tool, helping users understand the - [Docker](https://docs.docker.com/get-docker/) - [Terraform](https://developer.hashicorp.com/terraform/install) & [`tflocal` wrapper](https://github.com/localstack/terraform-local) - [AWS](https://docs.aws.amazon.com/cli/v1/userguide/cli-chap-install.html) CLI with [`awslocal` wrapper](https://github.com/localstack/awscli-local) -- [LocalStack Web Application account](https://app.localstack.cloud/sign-up) +- [LocalStack account](https://www.localstack.cloud/pricing) - [`jq`](https://jqlang.github.io/jq/download/) ## Architecture diagram diff --git a/src/content/docs/azure/getting-started/auth-token.mdx b/src/content/docs/azure/getting-started/auth-token.mdx index d57144020..dd949c51a 100644 --- a/src/content/docs/azure/getting-started/auth-token.mdx +++ b/src/content/docs/azure/getting-started/auth-token.mdx @@ -44,7 +44,7 @@ To access it, you need a LocalStack account with **any active subscription**. Th During the private preview, Azure access is enabled manually and cannot be self-served: - If you already have a LocalStack subscription (any type), [contact support](https://localstack.cloud/contact/) to have Azure access added. -- If you don't have a LocalStack subscription yet, sign up for a [Hobby subscription](https://app.localstack.cloud/sign-up) and then [contact support](https://localstack.cloud/contact/) to have Azure access added. +- If you don't have a LocalStack subscription yet, choose a [Hobby subscription](https://www.localstack.cloud/pricing) and then [contact support](https://localstack.cloud/contact/) to have Azure access added. Once Azure access is enabled on your subscription, you can use the emulator with your Developer Auth Token or CI Auth Token, just like any other LocalStack product. ::: diff --git a/src/content/docs/snowflake/getting-started/auth-token.mdx b/src/content/docs/snowflake/getting-started/auth-token.mdx index 3ea3f1c9a..f583cf0ca 100644 --- a/src/content/docs/snowflake/getting-started/auth-token.mdx +++ b/src/content/docs/snowflake/getting-started/auth-token.mdx @@ -38,7 +38,7 @@ Both the **Developer Auth Token** and **CI Auth Token** can be managed on the [A ## Managing your License To use the LocalStack for Snowflake emulator, a license with access to Snowflake is required. -You can get a license by registering on the [LocalStack Web Application](https://app.localstack.cloud/sign-up) and starting a trial, or by exploring additional features with a paid offering. +You can get a license by [signing up for a free LocalStack account](https://www.localstack.cloud/pricing) and starting a trial, or by exploring additional features with a paid offering. After initiating your trial or acquiring a license, assign it to a user by following these steps: From 6e38a5a2ef9fe929944f8404f39503f9e9c5291e Mon Sep 17 00:00:00 2001 From: Quetzalli Date: Wed, 8 Jul 2026 11:46:33 +0200 Subject: [PATCH 58/58] DOCS-294 (`hotfix`): CloudWatch Logs: document new SQLite-backed v2 provider (#759) (#770) Co-authored-by: Harsh Mishra --- src/content/docs/aws/services/logs.mdx | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/content/docs/aws/services/logs.mdx b/src/content/docs/aws/services/logs.mdx index 7f1fc26cf..bbb904e7d 100644 --- a/src/content/docs/aws/services/logs.mdx +++ b/src/content/docs/aws/services/logs.mdx @@ -13,6 +13,22 @@ import { Badge } from '@astrojs/starlight/components'; [CloudWatch Logs](https://docs.aws.amazon.com/cloudwatch/index.html) allows to store and retrieve logs. While some services automatically create and write logs (e.g. Lambda), logs can also be added manually. +:::note +We've introduced a **new CloudWatch Logs provider (`v2`)** backed by a persistent SQLite database. +It is an optional alternative to the default provider and is planned to become the default in an upcoming release. + +The main benefit is a significant reduction in memory usage for long-running instances that generate high volumes of log events, which addresses a memory leak present in the default provider. + +You can opt in to the new provider by setting: + +```bash +PROVIDER_OVERRIDE_LOGS=v2 +``` + +**Known limitation:** Switching to the `v2` provider on an existing instance results in an empty log event history, since log event data cannot be migrated from the default provider's in-memory store. +Metadata such as log groups, log streams, subscription filters, and tags is migrated correctly. +::: + ## Subscription Filters Subscription filters can be used to forward logs to certain services, e.g. Kinesis, Lambda, and Kinesis Data Firehose.