{"id":13329,"date":"2026-01-28T20:11:07","date_gmt":"2026-01-28T20:11:07","guid":{"rendered":"https:\/\/cheesecakelabs.com\/blog\/"},"modified":"2026-01-28T20:11:10","modified_gmt":"2026-01-28T20:11:10","slug":"deploying-fastapi-on-aws-app-runner","status":"publish","type":"post","link":"https:\/\/cheesecakelabs.com\/blog\/deploying-fastapi-on-aws-app-runner\/","title":{"rendered":"Deploying FastAPI on AWS App Runner: A Production-Ready Guide with CI\/CD"},"content":{"rendered":"\n<p>Deploying applications to AWS has a reputation: powerful, flexible\u2026 and occasionally capable of turning a calm afternoon into an unexpected adventure. Between IAM roles, container images, and networking choices, it\u2019s easy to feel like you need a map and a compass just to get a \u201cHello, world\u201d online.<\/p>\n\n\n\n<p>That\u2019s where <a href=\"https:\/\/aws.amazon.com\/pt\/apprunner\/\" target=\"_blank\" rel=\"noreferrer noopener\">AWS App Runner<\/a> comes in. It promises a simpler path: bring your application, point to a container or source repository, and let AWS handle the heavy lifting, including scaling, load balancing, and infrastructure management.<\/p>\n\n\n\n<p>In this article, we\u2019ll walk you through the process of deploying a <a href=\"https:\/\/fastapi.tiangolo.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">FastAPI<\/a> application on AWS App Runner, focusing on a clean, production-ready setup that avoidsthrough how to deploy a FastAPI application on AWS App Runner, focusing on a clean, production-ready setup without unnecessary complexity.<\/p>\n\n\n\n<p>If you enjoy fast APIs, fewer YAML files, and deployments that don\u2019t require a ritual sacrifice, you\u2019re in the right place.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why AWS App Runner is a practical choice for FastAPI deploymentsAWS configurations<\/h2>\n\n\n\n<p>Before writing any code, we need to set up a few basic resources in AWS. These configurations allow App Runner to pull our container image securely and run the FastAPI application.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Elastic container registry repository<\/h3>\n\n\n\n<p>First, create a repository to store the Docker image for the FastAPI application.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Navigate to <strong>Amazon ECR<\/strong> \u2192 <strong>Create repository<\/strong>.<\/li>\n\n\n\n<li>Choose a name for the repository. In this article, we\u2019ll use: <strong><em>fastapi-app-runner<\/em><\/strong><\/li>\n\n\n\n<li>Click <strong>Create repository<\/strong>.<\/li>\n<\/ol>\n\n\n\n<p>After creation, copy and keep the <strong><em>Repository URI<\/em><\/strong>. We\u2019ll need it later when building and pushing the Docker image.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">App Runner role<\/h3>\n\n\n\n<p>App Runner needs explicit permission to pull images from Amazon ECR. We\u2019ll grant this access by creating an IAM role.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Go to <strong>IAM<\/strong> \u2192 <strong>Roles<\/strong> \u2192 <strong>Create role<\/strong>.<\/li>\n\n\n\n<li>Select <strong>Custom trust policy<\/strong>.<\/li>\n\n\n\n<li>Paste the following JSON into the policy editor:<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">{\n\u00a0 <span class=\"hljs-attr\">\"Version\"<\/span>: <span class=\"hljs-string\">\"2012-10-17\"<\/span>,\n\u00a0 <span class=\"hljs-attr\">\"Statement\"<\/span>: &#91;\n\u00a0 \u00a0 {\n\u00a0 \u00a0 \u00a0 <span class=\"hljs-attr\">\"Effect\"<\/span>: <span class=\"hljs-string\">\"Allow\"<\/span>,\n\u00a0 \u00a0 \u00a0 <span class=\"hljs-attr\">\"Principal\"<\/span>: {\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-attr\">\"Service\"<\/span>: <span class=\"hljs-string\">\"apprunner.amazonaws.com\"<\/span>\n\u00a0 \u00a0 \u00a0 },\n\u00a0 \u00a0 \u00a0 <span class=\"hljs-attr\">\"Action\"<\/span>: <span class=\"hljs-string\">\"sts:AssumeRole\"<\/span>\n\u00a0 \u00a0 }\n\u00a0 ]\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li>Click Next.<\/li>\n\n\n\n<li>On the <strong>Permissions<\/strong> page, search for and attach the policy: <strong><em>AWSAppRunnerServicePolicyForECRAccess<\/em><\/strong><\/li>\n\n\n\n<li>Click Next, give the role a meaningful name (for example, <strong><em>AppRunnerECRAccessRole<\/em><\/strong>), and then click Create role.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Creating the App Runner service<\/h2>\n\n\n\n<p>With the AWS prerequisites in place, we can now create the App Runner service that will run our FastAPI application. Follow the steps below:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Navigate to <strong>AWS App Runner <\/strong>\u2192 <strong>Create service<\/strong>.<\/li>\n\n\n\n<li>For <strong>Repository type<\/strong>, select <strong>Container registry<\/strong>.<\/li>\n\n\n\n<li>For <strong>Provider<\/strong>, choose <strong>Amazon ECR<\/strong>. Paste the ECR repository URI created in the previous section and append the image<em> tag :latest<\/em><\/li>\n\n\n\n<li>For <strong>the deploymentDeployment trigger<\/strong>, select <strong>Automatic<\/strong>. With this option enabled, every new image pushed to ECR automatically triggers a new App Runner deployment.<\/li>\n\n\n\n<li>Select <strong>Use existing service role<\/strong> and choose the IAM role created earlier. This role allows App Runner to pull images from ECR.<\/li>\n\n\n\n<li>Click Next to open the <strong>Configure service<\/strong> page.<\/li>\n\n\n\n<li>Provide a name for your service.<\/li>\n\n\n\n<li>For simplicity, keep the <strong>default settings<\/strong> on this page. These options control instance size, scaling behavior, and additional IAM roles, which are more advanced topics and outside the scope of this article. We\u2019ll cover them in a future post.&nbsp;<\/li>\n\n\n\n<li>Review the configuration and click <strong>Create &amp; deploy<\/strong>.<\/li>\n<\/ol>\n\n\n\n<p>Once the service is created and the deployment completes, App Runner will start running your containerized FastAPI application. From this point on, we can focus on adapting the application code to work seamlessly with App Runner.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote has-text-medium-font-size is-layout-flow wp-block-quote-is-layout-flow\" style=\"padding-top:0;padding-right:0;padding-bottom:0;padding-left:0\">\n<p class=\"has-text-medium-font-size\" style=\"padding-top:var(--wp--preset--spacing--20);padding-right:var(--wp--preset--spacing--20);padding-bottom:var(--wp--preset--spacing--20);padding-left:var(--wp--preset--spacing--20)\"><strong> Read more: <\/strong><a href=\"https:\/\/cheesecakelabs.com\/blog\/beyond-vibe-coding-engineering-with-ai-and-cursor\/\" target=\"_blank\" rel=\"noreferrer noopener\">Beyond \u201cVibe Coding\u201d: Engineering with AI and Cursor<\/a><\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">CI\/CD foundations: Connecting GitHub to AWS Github configuration<\/h2>\n\n\n\n<p>To automate the build and deployment process, we need to configure GitHub with the required AWS credentials and environment-specific variables. This will allow our GitHub Actions workflow to authenticate with AWS and push Docker images to Amazon ECR.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Create a GitHub environment<\/h3>\n\n\n\n<p>Using environments helps isolate credentials and apply additional controls, such as required reviewers or environment-specific secrets.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Go to your GitHub repository.<\/li>\n\n\n\n<li>Navigate to <strong>Settings<\/strong> \u2192 <strong>Environments<\/strong>.<\/li>\n\n\n\n<li>Click <strong>New environment<\/strong>.<\/li>\n\n\n\n<li>Give the environment a name (for example, production or staging) and save it.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Managing AWS credentials and deployment variables securely<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Add environment secrets<\/h3>\n\n\n\n<p>With the environment created, we can now add the secrets required by the CI\/CD pipeline.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open the environment you just created.<\/li>\n\n\n\n<li>Under <strong>Environment secrets<\/strong>, click <strong>Add secret<\/strong>.<\/li>\n\n\n\n<li>Add the following secrets: AWS_ACCESS_KEY, AWS_SECRET_ACCESS_KEY, AWS_REGION, ECR_REPOSITORY_URI. Read this <a href=\"https:\/\/aws.amazon.com\/blogs\/security\/wheres-my-secret-access-key\/\">article<\/a> to get the KEY variables.<\/li>\n<\/ol>\n\n\n\n<p>Make sure the IAM credentials used here have permission to authenticate to ECR and push images to the repository.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Security best practices for CI\/CD<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Store credentials <strong>only<\/strong> as GitHub secrets. Never commit them to the repository.<\/li>\n\n\n\n<li>Use a dedicated IAM user or role with <strong>least-privilege permissions<\/strong>, limited to ECR access.<\/li>\n\n\n\n<li>If possible, consider using <strong>OIDC-based authentication<\/strong> with GitHub Actions to avoid long-lived AWS credentials. This approach is more secure and better suited for production environments.<\/li>\n<\/ul>\n\n\n\n<p>With the GitHub environment and secrets configured, we\u2019re ready to create the GitHub Actions workflow that builds the Docker image and pushes it to Amazon ECR automatically.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote has-text-medium-font-size is-layout-flow wp-block-quote-is-layout-flow\" style=\"padding-top:0;padding-right:var(--wp--preset--spacing--20);padding-bottom:0;padding-left:var(--wp--preset--spacing--20)\">\n<p><strong>Read more:<\/strong> <a href=\"https:\/\/cheesecakelabs.com\/blog\/selenium-scraper-aws-lambda\/\" target=\"_blank\" rel=\"noreferrer noopener\">How To Use Selenium To Web-Scrape on AWS Lambda<\/a><\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">Code changes: adapting the application for App Runner execution<\/h2>\n\n\n\n<p>Let\u2019s start with the file responsible for instantiating the FastAPI application. The code snippet below illustrates a minimal FastAPI setup, exposing a single GET \/health endpoint.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> os\n\n<span class=\"hljs-keyword\">from<\/span> fastapi <span class=\"hljs-keyword\">import<\/span> FastAPI\n<span class=\"hljs-keyword\">from<\/span> fastapi.middleware.cors <span class=\"hljs-keyword\">import<\/span> CORSMiddleware\n<span class=\"hljs-keyword\">from<\/span> starlette.middleware.sessions <span class=\"hljs-keyword\">import<\/span> SessionMiddleware\n\n\napp = FastAPI()\n\napp.add_middleware(\n\u00a0 \u00a0 CORSMiddleware,\n\u00a0 \u00a0 allow_origins=&#91;<span class=\"hljs-string\">\"*\"<\/span>],\n\u00a0 \u00a0 allow_credentials=True,\n\u00a0 \u00a0 allow_methods=&#91;<span class=\"hljs-string\">\"*\"<\/span>],\n\u00a0 \u00a0 allow_headers=&#91;<span class=\"hljs-string\">\"*\"<\/span>],\n)\n\napp.add_middleware(SessionMiddleware, secret_key=os.getenv(<span class=\"hljs-string\">\"JWT_SECRET_KEY\"<\/span>, <span class=\"hljs-string\">\"default\"<\/span>))\n\n@app.get(<span class=\"hljs-string\">\"\/health\"<\/span>)\n<span class=\"hljs-keyword\">async<\/span> def health_check():\n\u00a0 \u00a0 <span class=\"hljs-string\">\"\"<\/span><span class=\"hljs-string\">\"Health check endpoint.\"<\/span><span class=\"hljs-string\">\"\"<\/span>\n\u00a0 \u00a0 <span class=\"hljs-keyword\">return<\/span> {<span class=\"hljs-string\">\"status\"<\/span>: <span class=\"hljs-string\">\"ok\"<\/span>}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Now, let\u2019s take a look at the Dockerfile. This file is intentionally simple: it installs the dependencies using the uv package manager, sets the working directory, and invokes the entrypoint.sh script. Pay special attention to the <strong>exposed port<\/strong>, which must <strong>match the port configured in AWS App Runner<\/strong> (8080 by default).<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">FROM python:<span class=\"hljs-number\">3.12<\/span><span class=\"hljs-number\">.11<\/span>-slim-bookworm AS builder\n\nCOPY --<span class=\"hljs-keyword\">from<\/span>=ghcr.io\/astral-sh\/uv:latest \/uv \/uvx \/bin\/\n\nWORKDIR \/app\nENV PATH=<span class=\"hljs-string\">\"\/app\/.venv\/bin:$PATH\"<\/span>\n\nENV UV_LINK_MODE=copy\n\nCOPY pyproject.toml uv.lock .python-version .\/\nRUN uv sync --locked --no-dev\nRUN uv pip install --system alembic\n\nCOPY . .\n\nFROM python:<span class=\"hljs-number\">3.12<\/span><span class=\"hljs-number\">.11<\/span>-slim-bookworm\n\nCOPY --<span class=\"hljs-keyword\">from<\/span>=ghcr.io\/astral-sh\/uv:latest \/uv \/uvx \/bin\/\nRUN apt-<span class=\"hljs-keyword\">get<\/span> update &amp;&amp; \\\n    apt-<span class=\"hljs-keyword\">get<\/span> upgrade -y &amp;&amp; \\\n    apt-<span class=\"hljs-keyword\">get<\/span> clean &amp;&amp; \\\n    rm -rf \/var\/lib\/apt\/lists\/* \/tmp\/* \/var\/tmp\/*\n\nRUN pip install --upgrade pip setuptools\n\nWORKDIR \/app\nENV PATH=\"\/app\/.venv\/bin:$PATH\"\n\nCOPY --from=builder \/app \/app\nCOPY entrypoint.sh \/entrypoint.sh\n\nRUN chmod +x \/entrypoint.sh\n\nEXPOSE 8080\n\nENTRYPOINT &#91;\"\/entrypoint.sh\"]<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The docker-compose.yml file is also straightforward. It references the Dockerfile, exposes the container ports, and loads environment variables from the .env file.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">services<\/span>:\n\u00a0 <span class=\"hljs-selector-tag\">singuessr<\/span>:\n\u00a0 \u00a0 <span class=\"hljs-selector-tag\">build<\/span>:\n\u00a0 \u00a0 \u00a0 <span class=\"hljs-selector-tag\">context<\/span>: .\n\u00a0 \u00a0 \u00a0 <span class=\"hljs-selector-tag\">dockerfile<\/span>: <span class=\"hljs-selector-tag\">Dockerfile<\/span>\n\u00a0 \u00a0 <span class=\"hljs-selector-tag\">ports<\/span>:\n\u00a0 \u00a0 \u00a0 <span class=\"hljs-selector-tag\">-<\/span> \"8080<span class=\"hljs-selector-pseudo\">:8000\"<\/span>\n\u00a0 \u00a0 <span class=\"hljs-selector-tag\">env_file<\/span>:\n\u00a0 \u00a0 \u00a0 <span class=\"hljs-selector-tag\">-<\/span> <span class=\"hljs-selector-class\">.env<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Finally, the <strong>entrypoint.sh<\/strong> script starts the Uvicorn server, listening on port 8080.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">#!\/bin\/sh<\/span>\n\nset -e\n\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Starting application...\"<\/span>\nuv run uvicorn main:app --host <span class=\"hljs-number\">0.0<\/span><span class=\"hljs-number\">.0<\/span><span class=\"hljs-number\">.0<\/span> --port <span class=\"hljs-number\">8080<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Automating builds and deployments with GitHub actions<\/h2>\n\n\n\n<p><strong>Github Actions<\/strong><\/p>\n\n\n\n<p>Create a file named .github\/workflows\/app-runner-deploy.yml at the root of your project and add the configuration shown below. This workflow defines the GitHub Actions pipeline responsible for the deployment process. It performs the following steps: authenticates with AWS, builds the Docker image, tags the image, and pushes it to Amazon ECR.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">name: AWS App Runner Deploy Develop\n\non:\n\u00a0 push:\n\u00a0 \u00a0 branches:\n\u00a0 \u00a0 \u00a0 - main <span class=\"hljs-comment\"># \u2190 branch name<\/span>\n\njobs:\n\u00a0 deploy:\n\u00a0 \u00a0 name: FastAPI deployment to AWS App Runner\n\u00a0 \u00a0 runs-on: ubuntu-latest\n\u00a0 \u00a0 environment: Production <span class=\"hljs-comment\"># \u2190 Github environment<\/span>\n\n\u00a0 \u00a0 steps:\n\u00a0 \u00a0 \u00a0 - name: Checkout\n\u00a0 \u00a0 \u00a0 \u00a0 uses: actions\/checkout@v3\n\n\u00a0 \u00a0 \u00a0 - name: Configure AWS Credentials\n\u00a0 \u00a0 \u00a0 \u00a0 uses: aws-actions\/configure-aws-credentials@v2\n\u00a0 \u00a0 \u00a0 \u00a0 with:\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }}\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 aws-region: ${{ secrets.AWS_REGION }}\n\n\u00a0 \u00a0 \u00a0 - name: Login to Amazon ECR\n\u00a0 \u00a0 \u00a0 \u00a0 uses: aws-actions\/amazon-ecr-login@v1\n\n\u00a0 \u00a0 \u00a0 - name: Build Docker image\n\u00a0 \u00a0 \u00a0 \u00a0 run: |\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 docker build \\\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 -t fastapi-app-runner:latest \\\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 -f Dockerfile .\n\n\u00a0 \u00a0 \u00a0 - name: Tag Docker image\n\u00a0 \u00a0 \u00a0 \u00a0 run: |\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 docker tag fastapi-app-runner:latest \\\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ${{ secrets.ECR_REPOSITORY_URI }}:latest\n\n\u00a0 \u00a0 \u00a0 - name: Push Docker image to ECR\n\u00a0 \u00a0 \u00a0 \u00a0 run: |\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 docker push ${{ secrets.ECR_REPOSITORY_URI }}:latest<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>After committing and pushing your changes to the appropriate branch (in this example, the branch named main), you will see the workflow execution in the <strong>Actions<\/strong> tab. If everything is configured correctly, all steps will complete successfully.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"304\" height=\"181\" src=\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/01\/app-runner-deploy.png\" alt=\"\" class=\"wp-image-13339\"\/><\/figure>\n\n\n\n<p>The final result is a Docker image available in your Amazon ECR repository.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1094\" height=\"299\" src=\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/01\/fastapi-app-runner.png\" alt=\"\" class=\"wp-image-13337\" srcset=\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/01\/fastapi-app-runner.png 1094w, https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/01\/fastapi-app-runner-600x164.png 600w, https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/01\/fastapi-app-runner-768x210.png 768w, https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/01\/fastapi-app-runner-760x208.png 760w\" sizes=\"(max-width: 1094px) 100vw, 1094px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">App Runner deploying: triggering and monitoring automatic deployments<\/h2>\n\n\n\n<p>After you push your code to the branch defined in the GitHub Actions workflow, the App Runner deployment will be triggered automatically. You can monitor the deployment process and review all runtime logs directly in the App Runner service console.<\/p>\n\n\n\n<p>The deployment should complete within a few minutes.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1200\" height=\"278\" src=\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/01\/app-runner-event-log-1200x278.png\" alt=\"\" class=\"wp-image-13345\" srcset=\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/01\/app-runner-event-log-1200x278.png 1200w, https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/01\/app-runner-event-log-600x139.png 600w, https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/01\/app-runner-event-log-768x178.png 768w, https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/01\/app-runner-event-log-1536x355.png 1536w, https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/01\/app-runner-event-log-760x176.png 760w, https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/01\/app-runner-event-log.png 1600w\" sizes=\"(max-width: 1200px) 100vw, 1200px\" \/><\/figure>\n\n\n\n<p>To test the application, access its URL by clicking the <strong>Default domain<\/strong> and, for example, request the \/docs endpoint to view the API documentation.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1200\" height=\"272\" src=\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/01\/fast-ap-1200x272.png\" alt=\"\" class=\"wp-image-13343\" srcset=\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/01\/fast-ap-1200x272.png 1200w, https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/01\/fast-ap-600x136.png 600w, https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/01\/fast-ap-768x174.png 768w, https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/01\/fast-ap-1536x348.png 1536w, https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/01\/fast-ap-760x172.png 760w, https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/01\/fast-ap.png 1600w\" sizes=\"(max-width: 1200px) 100vw, 1200px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Final comments and next steps<\/h2>\n\n\n\n<p>AWS App Runner offers a compelling balance between simplicity and operational robustness. For containerized applications like FastAPI services, it removes much of the traditional overhead associated with infrastructure management while still integrating cleanly with the broader AWS ecosystem.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Why App Runner works well for FastAPI<\/h3>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<ul class=\"wp-block-list\">\n<li>Minimal operational overhead: No need to manage clusters, load balancers, or scaling policies manually.<\/li>\n\n\n\n<li>Native container support: Direct integration with Amazon ECR simplifies the deployment pipeline.<\/li>\n\n\n\n<li>Automatic scaling: The service scales up and down based on traffic without additional configuration.<\/li>\n\n\n\n<li>Built-in security and networking: HTTPS, load balancing, and service isolation are handled by AWS.<\/li>\n\n\n\n<li>Fast iteration cycles: Combined with GitHub Actions, deployments become predictable and repeatable.<\/li>\n<\/ul>\n<\/div><\/div>\n\n\n\n<p>For many backend services and APIs, App Runner hits a sweet spot between fully managed platforms and more complex solutions like ECS or EKS.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote has-text-medium-font-size is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Read more: <\/strong><a href=\"https:\/\/cheesecakelabs.com\/blog\/aws-finops-best-practices\/\" target=\"_blank\" rel=\"noreferrer noopener\">AWS FinOps Best Practices: How to Cut and Optimize Cloud Costs<\/a><\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">Next steps: scaling, security, and operational enhancements<\/h2>\n\n\n\n<p>While this article focuses on a simple and functional setup, there are several areas worth exploring next:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Fine-tune instance configuration:<\/strong> App Runner allows you to adjust CPU and memory settings, concurrency limits, and auto-scaling behavior. These options are essential for optimizing performance and cost as traffic grows.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Infrastructure as Code with Terraform:<\/strong> Managing App Runner services, IAM roles, and ECR repositories with Terraform improves reproducibility and governance. It also makes multi-environment setups (staging, production) easier to maintain and review.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Security improvements:<\/strong> Consider replacing static AWS credentials in GitHub Actions with OIDC-based authentication and tightening IAM permissions following the principle of least privilege.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Observability and monitoring:<\/strong> Integrate Amazon CloudWatch logs, metrics, and alarms to gain better visibility into application behavior and performance.<\/li>\n<\/ul>\n\n\n\n<p>In short, App Runner is an excellent entry point for running production-grade<strong> FastAPI applications on AWS. <\/strong>As requirements grow, you can progressively layer in more control and automation without abandoning the simplicity that makes App Runner attractive in the first place.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Deploying applications to AWS has a reputation: powerful, flexible\u2026 and occasionally capable of turning a calm afternoon into an unexpected adventure. Between IAM roles, container images, and networking choices, it\u2019s easy to feel like you need a map and a compass just to get a \u201cHello, world\u201d online. That\u2019s where AWS App Runner comes in. [&hellip;]<\/p>\n","protected":false},"author":92,"featured_media":13334,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[432,1162],"tags":[1350,1330,1351],"class_list":["post-13329","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-engineering","category-process","tag-app-runner","tag-aws","tag-fastapi"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Deploying FastAPI on AWS App Runner with CI\/CD<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cheesecakelabs.com\/blog\/deploying-fastapi-on-aws-app-runner\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Deploying FastAPI on AWS App Runner with CI\/CD\" \/>\n<meta property=\"og:description\" content=\"Deploying applications to AWS has a reputation: powerful, flexible\u2026 and occasionally capable of turning a calm afternoon into an unexpected adventure. Between IAM roles, container images, and networking choices, it\u2019s easy to feel like you need a map and a compass just to get a \u201cHello, world\u201d online. That\u2019s where AWS App Runner comes in. [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cheesecakelabs.com\/blog\/deploying-fastapi-on-aws-app-runner\/\" \/>\n<meta property=\"og:site_name\" content=\"Cheesecake Labs\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/cheesecakelabs\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-28T20:11:07+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-01-28T20:11:10+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/01\/deploying-fastapi.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"860\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Cheesecake Labs\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@cheesecakelabs\" \/>\n<meta name=\"twitter:site\" content=\"@cheesecakelabs\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/deploying-fastapi-on-aws-app-runner\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/deploying-fastapi-on-aws-app-runner\/\"},\"author\":{\"name\":\"Marcelo Bittencourt\"},\"headline\":\"Deploying FastAPI on AWS App Runner: A Production-Ready Guide with CI\/CD\",\"datePublished\":\"2026-01-28T20:11:07+00:00\",\"dateModified\":\"2026-01-28T20:11:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/deploying-fastapi-on-aws-app-runner\/\"},\"wordCount\":1463,\"image\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/deploying-fastapi-on-aws-app-runner\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/01\/deploying-fastapi.jpg\",\"keywords\":[\"app runner\",\"aws\",\"FastAPI\"],\"articleSection\":[\"Engineering\",\"Process\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/deploying-fastapi-on-aws-app-runner\/\",\"url\":\"https:\/\/cheesecakelabs.com\/blog\/deploying-fastapi-on-aws-app-runner\/\",\"name\":\"Deploying FastAPI on AWS App Runner with CI\/CD\",\"isPartOf\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/deploying-fastapi-on-aws-app-runner\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/deploying-fastapi-on-aws-app-runner\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/01\/deploying-fastapi.jpg\",\"datePublished\":\"2026-01-28T20:11:07+00:00\",\"dateModified\":\"2026-01-28T20:11:10+00:00\",\"author\":{\"@type\":\"person\",\"name\":\"Marcelo Bittencourt\"},\"breadcrumb\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/deploying-fastapi-on-aws-app-runner\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cheesecakelabs.com\/blog\/deploying-fastapi-on-aws-app-runner\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/deploying-fastapi-on-aws-app-runner\/#primaryimage\",\"url\":\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/01\/deploying-fastapi.jpg\",\"contentUrl\":\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/01\/deploying-fastapi.jpg\",\"width\":1920,\"height\":860},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/deploying-fastapi-on-aws-app-runner\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cheesecakelabs.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Deploying FastAPI on AWS App Runner: A Production-Ready Guide with CI\/CD\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/#website\",\"url\":\"https:\/\/cheesecakelabs.com\/blog\/\",\"name\":\"Cheesecake Labs\",\"description\":\"Nearshore outsourcing company for Web and Mobile design and engineering services, and staff augmentation for startups and enterprises..\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cheesecakelabs.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"name\":\"Marcelo Bittencourt\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/01\/perfil-marcelo-bittencourt.jpg\",\"contentUrl\":\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/01\/perfil-marcelo-bittencourt.jpg\",\"caption\":\"Marcelo Bittencourt\"},\"url\":\"https:\/\/cheesecakelabs.com\/blog\/autor\/marcelo-bittencourt\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Deploying FastAPI on AWS App Runner with CI\/CD","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/cheesecakelabs.com\/blog\/deploying-fastapi-on-aws-app-runner\/","og_locale":"en_US","og_type":"article","og_title":"Deploying FastAPI on AWS App Runner with CI\/CD","og_description":"Deploying applications to AWS has a reputation: powerful, flexible\u2026 and occasionally capable of turning a calm afternoon into an unexpected adventure. Between IAM roles, container images, and networking choices, it\u2019s easy to feel like you need a map and a compass just to get a \u201cHello, world\u201d online. That\u2019s where AWS App Runner comes in. [&hellip;]","og_url":"https:\/\/cheesecakelabs.com\/blog\/deploying-fastapi-on-aws-app-runner\/","og_site_name":"Cheesecake Labs","article_publisher":"https:\/\/www.facebook.com\/cheesecakelabs","article_published_time":"2026-01-28T20:11:07+00:00","article_modified_time":"2026-01-28T20:11:10+00:00","og_image":[{"width":1920,"height":860,"url":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/01\/deploying-fastapi.jpg","type":"image\/jpeg"}],"author":"Cheesecake Labs","twitter_card":"summary_large_image","twitter_creator":"@cheesecakelabs","twitter_site":"@cheesecakelabs","twitter_misc":{"Written by":null,"Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/cheesecakelabs.com\/blog\/deploying-fastapi-on-aws-app-runner\/#article","isPartOf":{"@id":"https:\/\/cheesecakelabs.com\/blog\/deploying-fastapi-on-aws-app-runner\/"},"author":{"name":"Marcelo Bittencourt"},"headline":"Deploying FastAPI on AWS App Runner: A Production-Ready Guide with CI\/CD","datePublished":"2026-01-28T20:11:07+00:00","dateModified":"2026-01-28T20:11:10+00:00","mainEntityOfPage":{"@id":"https:\/\/cheesecakelabs.com\/blog\/deploying-fastapi-on-aws-app-runner\/"},"wordCount":1463,"image":{"@id":"https:\/\/cheesecakelabs.com\/blog\/deploying-fastapi-on-aws-app-runner\/#primaryimage"},"thumbnailUrl":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/01\/deploying-fastapi.jpg","keywords":["app runner","aws","FastAPI"],"articleSection":["Engineering","Process"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/cheesecakelabs.com\/blog\/deploying-fastapi-on-aws-app-runner\/","url":"https:\/\/cheesecakelabs.com\/blog\/deploying-fastapi-on-aws-app-runner\/","name":"Deploying FastAPI on AWS App Runner with CI\/CD","isPartOf":{"@id":"https:\/\/cheesecakelabs.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cheesecakelabs.com\/blog\/deploying-fastapi-on-aws-app-runner\/#primaryimage"},"image":{"@id":"https:\/\/cheesecakelabs.com\/blog\/deploying-fastapi-on-aws-app-runner\/#primaryimage"},"thumbnailUrl":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/01\/deploying-fastapi.jpg","datePublished":"2026-01-28T20:11:07+00:00","dateModified":"2026-01-28T20:11:10+00:00","author":{"@type":"person","name":"Marcelo Bittencourt"},"breadcrumb":{"@id":"https:\/\/cheesecakelabs.com\/blog\/deploying-fastapi-on-aws-app-runner\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cheesecakelabs.com\/blog\/deploying-fastapi-on-aws-app-runner\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cheesecakelabs.com\/blog\/deploying-fastapi-on-aws-app-runner\/#primaryimage","url":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/01\/deploying-fastapi.jpg","contentUrl":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/01\/deploying-fastapi.jpg","width":1920,"height":860},{"@type":"BreadcrumbList","@id":"https:\/\/cheesecakelabs.com\/blog\/deploying-fastapi-on-aws-app-runner\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cheesecakelabs.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Deploying FastAPI on AWS App Runner: A Production-Ready Guide with CI\/CD"}]},{"@type":"WebSite","@id":"https:\/\/cheesecakelabs.com\/blog\/#website","url":"https:\/\/cheesecakelabs.com\/blog\/","name":"Cheesecake Labs","description":"Nearshore outsourcing company for Web and Mobile design and engineering services, and staff augmentation for startups and enterprises..","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cheesecakelabs.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","name":"Marcelo Bittencourt","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cheesecakelabs.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/01\/perfil-marcelo-bittencourt.jpg","contentUrl":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2026\/01\/perfil-marcelo-bittencourt.jpg","caption":"Marcelo Bittencourt"},"url":"https:\/\/cheesecakelabs.com\/blog\/autor\/marcelo-bittencourt\/"}]}},"_links":{"self":[{"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/posts\/13329","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/users\/92"}],"replies":[{"embeddable":true,"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/comments?post=13329"}],"version-history":[{"count":7,"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/posts\/13329\/revisions"}],"predecessor-version":[{"id":13348,"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/posts\/13329\/revisions\/13348"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/media\/13334"}],"wp:attachment":[{"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/media?parent=13329"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/categories?post=13329"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cheesecakelabs.com\/blog\/wp-json\/wp\/v2\/tags?post=13329"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}