{"id":14538,"date":"2026-01-28T20:11:07","date_gmt":"2026-01-28T20:11:07","guid":{"rendered":"https:\/\/cheesecakelabs.com\/blog\/deploy-fastapi-aws-app-runner\/"},"modified":"2026-08-15T07:06:58","modified_gmt":"2026-08-15T07:06:58","slug":"deploy-fastapi-aws-app-runner","status":"publish","type":"post","link":"https:\/\/cheesecakelabs.com\/blog\/br\/deploy-fastapi-aws-app-runner\/","title":{"rendered":"Deploy de FastAPI no AWS App Runner: um guia pronto para produ\u00e7\u00e3o"},"content":{"rendered":"\n<p>Fazer deploy de aplica\u00e7\u00f5es na AWS tem fama: poderoso, flex\u00edvel\u2026 e vez ou outra capaz de transformar uma tarde tranquila em uma aventura inesperada. Entre roles de IAM, imagens de container e decis\u00f5es de rede, \u00e9 f\u00e1cil sentir que voc\u00ea precisa de mapa e b\u00fassola s\u00f3 para colocar um \u201cHello, world\u201d no ar.<\/p>\n\n\n\n<p>\u00c9 a\u00ed que entra o <a href=\"https:\/\/aws.amazon.com\/pt\/apprunner\/\" target=\"_blank\" rel=\"noreferrer noopener\">AWS App Runner<\/a>. A proposta \u00e9 um caminho mais simples: voc\u00ea traz a sua aplica\u00e7\u00e3o, aponta para um container ou para um reposit\u00f3rio de c\u00f3digo, e a AWS cuida do trabalho pesado, incluindo escala, load balancing e gest\u00e3o de infraestrutura.<\/p>\n\n\n\n<p>Neste artigo, voc\u00ea vai percorrer o processo de deploy de uma aplica\u00e7\u00e3o <a href=\"https:\/\/fastapi.tiangolo.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">FastAPI<\/a> no AWS App Runner, com foco em um setup limpo e pronto para produ\u00e7\u00e3o, sem complexidade desnecess\u00e1ria.<\/p>\n\n\n\n<p>Se voc\u00ea gosta de APIs r\u00e1pidas, menos arquivos YAML e deploys que n\u00e3o exigem sacrif\u00edcio ritual, est\u00e1 no lugar certo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Configura\u00e7\u00f5es na AWS<\/h2>\n\n\n\n<p>Antes de escrever qualquer c\u00f3digo, \u00e9 preciso criar alguns recursos b\u00e1sicos na AWS. Essas configura\u00e7\u00f5es permitem que o App Runner puxe a imagem do container com seguran\u00e7a e execute a aplica\u00e7\u00e3o FastAPI.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Reposit\u00f3rio no Elastic Container Registry<\/h3>\n\n\n\n<p>Primeiro, crie um reposit\u00f3rio para armazenar a imagem Docker da aplica\u00e7\u00e3o FastAPI.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>V\u00e1 em <strong>Amazon ECR<\/strong> \u2192 <strong>Create repository<\/strong>.<\/li>\n\n\n\n<li>Escolha um nome para o reposit\u00f3rio. Neste artigo, vamos usar: <strong><em>fastapi-app-runner<\/em><\/strong><\/li>\n\n\n\n<li>Clique em <strong>Create repository<\/strong>.<\/li>\n<\/ol>\n\n\n\n<p>Depois de criar, copie e guarde o <strong><em>Repository URI<\/em><\/strong>. Ele ser\u00e1 necess\u00e1rio mais adiante, na hora de fazer o build e o push da imagem Docker.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">A role do App Runner<\/h3>\n\n\n\n<p>O App Runner precisa de permiss\u00e3o expl\u00edcita para puxar imagens do Amazon ECR. Esse acesso \u00e9 concedido criando uma role no IAM.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>V\u00e1 em <strong>IAM<\/strong> \u2192 <strong>Roles<\/strong> \u2192 <strong>Create role<\/strong>.<\/li>\n\n\n\n<li>Selecione <strong>Custom trust policy<\/strong>.<\/li>\n\n\n\n<li>Cole o JSON abaixo no editor de policy:<\/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>Clique em Next.<\/li>\n\n\n\n<li>Na p\u00e1gina <strong>Permissions<\/strong>, busque e anexe a policy: <strong><em>AWSAppRunnerServicePolicyForECRAccess<\/em><\/strong><\/li>\n\n\n\n<li>Clique em Next, d\u00ea um nome significativo para a role (por exemplo, <strong><em>AppRunnerECRAccessRole<\/em><\/strong>) e clique em Create role.<\/li>\n<\/ol>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Leia tamb\u00e9m: <\/strong><a href=\"https:\/\/cheesecakelabs.com\/blog\/construindo-redes-neurais-do-zero\/\" id=\"12542\" target=\"_blank\" rel=\"noreferrer noopener\">Construindo redes neurais do zero<\/a><\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">Criando o servi\u00e7o no App Runner<\/h2>\n\n\n\n<p>Com os pr\u00e9-requisitos da AWS prontos, chegou a hora de criar o servi\u00e7o do App Runner que vai rodar a aplica\u00e7\u00e3o FastAPI. Siga os passos abaixo:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>V\u00e1 em <strong>AWS App Runner <\/strong>\u2192 <strong>Create service<\/strong>.<\/li>\n\n\n\n<li>Em <strong>Repository type<\/strong>, selecione <strong>Container registry<\/strong>.<\/li>\n\n\n\n<li>Em <strong>Provider<\/strong>, escolha <strong>Amazon ECR<\/strong>. Cole o URI do reposit\u00f3rio ECR criado na se\u00e7\u00e3o anterior e acrescente a<em> tag :latest<\/em> da imagem<\/li>\n\n\n\n<li>Em <strong>Deployment trigger<\/strong>, selecione <strong>Automatic<\/strong>. Com essa op\u00e7\u00e3o ativada, cada nova imagem enviada para o ECR dispara automaticamente um novo deploy no App Runner.<\/li>\n\n\n\n<li>Selecione <strong>Use existing service role<\/strong> e escolha a role do IAM criada antes. \u00c9 ela que permite ao App Runner puxar imagens do ECR.<\/li>\n\n\n\n<li>Clique em Next para abrir a p\u00e1gina <strong>Configure service<\/strong>.<\/li>\n\n\n\n<li>D\u00ea um nome ao seu servi\u00e7o.<\/li>\n\n\n\n<li>Para simplificar, mantenha as <strong>configura\u00e7\u00f5es padr\u00e3o<\/strong> desta p\u00e1gina. Essas op\u00e7\u00f5es controlam tamanho de inst\u00e2ncia, comportamento de escala e roles adicionais do IAM, temas mais avan\u00e7ados e fora do escopo deste artigo. Vamos tratar deles em um post futuro.&nbsp;<\/li>\n\n\n\n<li>Revise a configura\u00e7\u00e3o e clique em <strong>Create &amp; deploy<\/strong>.<\/li>\n<\/ol>\n\n\n\n<p>Assim que o servi\u00e7o for criado e o deploy terminar, o App Runner passa a executar a sua aplica\u00e7\u00e3o FastAPI conteinerizada. Daqui em diante, o foco \u00e9 adaptar o c\u00f3digo da aplica\u00e7\u00e3o para funcionar bem com o 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 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);font-size:18px\"><strong> Leia tamb\u00e9m: <\/strong><a href=\"https:\/\/cheesecakelabs.com\/blog\/alem-do-vibe-coding-engenharia-cursor\/\" target=\"_blank\" rel=\"noreferrer noopener\">Al\u00e9m do \u201cvibe coding\u201d: engenharia com IA e Cursor<\/a><\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">A base do CI\/CD: conectando o GitHub \u00e0 AWS<\/h2>\n\n\n\n<p>Para automatizar o processo de build e deploy, \u00e9 preciso configurar no GitHub as credenciais da AWS e as vari\u00e1veis espec\u00edficas de cada ambiente. Isso permite que o workflow do GitHub Actions se autentique na AWS e envie imagens Docker para o Amazon ECR.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Crie um ambiente no GitHub<\/h3>\n\n\n\n<p>Usar ambientes ajuda a isolar credenciais e aplicar controles extras, como revisores obrigat\u00f3rios ou secrets espec\u00edficos de cada ambiente.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Acesse o seu reposit\u00f3rio no GitHub.<\/li>\n\n\n\n<li>V\u00e1 em <strong>Settings<\/strong> \u2192 <strong>Environments<\/strong>.<\/li>\n\n\n\n<li>Clique em <strong>New environment<\/strong>.<\/li>\n\n\n\n<li>D\u00ea um nome ao ambiente (por exemplo, production ou staging) e salve.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Gerenciando credenciais da AWS e vari\u00e1veis de deploy com seguran\u00e7a<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Adicione os secrets do ambiente<\/h3>\n\n\n\n<p>Com o ambiente criado, o pr\u00f3ximo passo \u00e9 adicionar os secrets que o pipeline de CI\/CD precisa.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Abra o ambiente que voc\u00ea acabou de criar.<\/li>\n\n\n\n<li>Em <strong>Environment secrets<\/strong>, clique em <strong>Add secret<\/strong>.<\/li>\n\n\n\n<li>Adicione os seguintes secrets: AWS_ACCESS_KEY, AWS_SECRET_ACCESS_KEY, AWS_REGION, ECR_REPOSITORY_URI. Leia este <a href=\"https:\/\/aws.amazon.com\/blogs\/security\/wheres-my-secret-access-key\/\" target=\"_blank\" rel=\"noreferrer noopener\">artigo<\/a> para obter as vari\u00e1veis KEY.<\/li>\n<\/ol>\n\n\n\n<p>Garanta que as credenciais do IAM usadas aqui tenham permiss\u00e3o para autenticar no ECR e enviar imagens para o reposit\u00f3rio.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Boas pr\u00e1ticas de seguran\u00e7a para CI\/CD<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Guarde credenciais <strong>apenas<\/strong> como secrets do GitHub. Nunca fa\u00e7a commit delas no reposit\u00f3rio.<\/li>\n\n\n\n<li>Use um usu\u00e1rio ou uma role do IAM dedicados, com <strong>permiss\u00f5es m\u00ednimas<\/strong>, limitadas ao acesso ao ECR.<\/li>\n\n\n\n<li>Se poss\u00edvel, considere usar <strong>autentica\u00e7\u00e3o baseada em OIDC<\/strong> com o GitHub Actions para evitar credenciais de longa dura\u00e7\u00e3o na AWS. Essa abordagem \u00e9 mais segura e mais adequada a ambientes de produ\u00e7\u00e3o.<\/li>\n<\/ul>\n\n\n\n<p>Com o ambiente e os secrets configurados no GitHub, chegou a hora de criar o workflow do GitHub Actions que faz o build da imagem Docker e a envia automaticamente para o Amazon ECR.<\/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>Leia tamb\u00e9m:<\/strong> <a href=\"https:\/\/cheesecakelabs.com\/blog\/selenium-web-scraping-aws-lambda\/\" target=\"_blank\" rel=\"noreferrer noopener\">Como usar Selenium para web scraping no AWS Lambda<\/a><\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">Mudan\u00e7as no c\u00f3digo: adaptando a aplica\u00e7\u00e3o para rodar no App Runner<\/h2>\n\n\n\n<p>Vamos come\u00e7ar pelo arquivo respons\u00e1vel por instanciar a aplica\u00e7\u00e3o FastAPI. O trecho de c\u00f3digo abaixo mostra um setup m\u00ednimo de FastAPI, expondo um \u00fanico endpoint GET \/health.<\/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>Agora, veja o Dockerfile. Ele \u00e9 propositalmente simples: instala as dependencies com o gerenciador de pacotes uv, define o diret\u00f3rio de trabalho e chama o script entrypoint.sh. Preste aten\u00e7\u00e3o especial na <strong>porta exposta<\/strong>, que precisa <strong>coincidir com a porta configurada no AWS App Runner<\/strong> (8080 por padr\u00e3o).<\/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>O arquivo docker-compose.yml tamb\u00e9m \u00e9 direto. Ele referencia o Dockerfile, exp\u00f5e as portas do container e carrega as vari\u00e1veis de ambiente do arquivo .env.<\/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>Por fim, o script <strong>entrypoint.sh<\/strong> sobe o servidor Uvicorn, escutando na porta 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\">Automatizando build e deploy com GitHub Actions<\/h2>\n\n\n\n<p>Crie um arquivo chamado .github\/workflows\/app-runner-deploy.yml na raiz do projeto e adicione a configura\u00e7\u00e3o abaixo. Esse workflow define o pipeline do GitHub Actions respons\u00e1vel pelo deploy. Ele executa os seguintes passos: autentica na AWS, faz o build da imagem Docker, aplica a tag e envia a imagem para o 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>Depois de fazer o commit e o push das suas mudan\u00e7as para a branch escolhida (neste exemplo, a branch main), a execu\u00e7\u00e3o do workflow aparece na aba <strong>Actions<\/strong>. Se tudo estiver configurado corretamente, todos os passos v\u00e3o terminar com sucesso.<\/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=\"Configura\u00e7\u00e3o de deploy do servi\u00e7o no AWS App Runner\" class=\"wp-image-13339\" \/><\/figure>\n\n\n\n<p>O resultado final \u00e9 uma imagem Docker dispon\u00edvel no seu reposit\u00f3rio do Amazon ECR.<\/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=\"Aplica\u00e7\u00e3o FastAPI rodando no AWS App Runner\" 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\">Deploy no App Runner: disparando e acompanhando publica\u00e7\u00f5es autom\u00e1ticas<\/h2>\n\n\n\n<p>Depois que voc\u00ea envia o c\u00f3digo para a branch definida no workflow do GitHub Actions, o deploy no App Runner \u00e9 disparado automaticamente. Voc\u00ea acompanha o processo e consulta todos os logs de execu\u00e7\u00e3o direto no console do servi\u00e7o do App Runner.<\/p>\n\n\n\n<p>O deploy deve terminar em poucos minutos.<\/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=\"Log de eventos do AWS App Runner durante uma publica\u00e7\u00e3o autom\u00e1tica\" 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>Para testar a aplica\u00e7\u00e3o, acesse a URL clicando em <strong>Default domain<\/strong> e chame, por exemplo, o endpoint \/docs para ver a documenta\u00e7\u00e3o da API.<\/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=\"Resposta da API FastAPI publicada no AWS App Runner\" 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\">Considera\u00e7\u00f5es finais e pr\u00f3ximos passos<\/h2>\n\n\n\n<p>O AWS App Runner oferece um equil\u00edbrio convincente entre simplicidade e robustez operacional. Para aplica\u00e7\u00f5es conteinerizadas como servi\u00e7os FastAPI, ele elimina boa parte do overhead tradicional de gest\u00e3o de infraestrutura e ainda se integra de forma limpa ao restante do ecossistema AWS.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Por que o App Runner funciona bem com 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>Overhead operacional m\u00ednimo: n\u00e3o \u00e9 preciso gerenciar clusters, load balancers ou pol\u00edticas de escala manualmente.<\/li>\n\n\n\n<li>Suporte nativo a containers: a integra\u00e7\u00e3o direta com o Amazon ECR simplifica o pipeline de deploy.<\/li>\n\n\n\n<li>Escala autom\u00e1tica: o servi\u00e7o sobe e desce conforme o tr\u00e1fego, sem configura\u00e7\u00e3o adicional.<\/li>\n\n\n\n<li>Seguran\u00e7a e rede embutidas: HTTPS, load balancing e isolamento de servi\u00e7o ficam por conta da AWS.<\/li>\n\n\n\n<li>Ciclos de itera\u00e7\u00e3o curtos: combinado com o GitHub Actions, o deploy fica previs\u00edvel e repet\u00edvel.<\/li>\n<\/ul>\n<\/div><\/div>\n\n\n\n<p>Para muitos servi\u00e7os de backend e APIs, o App Runner acerta o ponto entre plataformas totalmente gerenciadas e solu\u00e7\u00f5es mais complexas como ECS ou 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>Leia tamb\u00e9m: <\/strong><a href=\"https:\/\/cheesecakelabs.com\/blog\/boas-praticas-finops-aws-custos-cloud\/\" target=\"_blank\" rel=\"noreferrer noopener\">Boas pr\u00e1ticas de FinOps na AWS: como cortar e otimizar custos de cloud<\/a><\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">Pr\u00f3ximos passos: escala, seguran\u00e7a e melhorias operacionais<\/h2>\n\n\n\n<p>Este artigo foca em um setup simples e funcional, mas h\u00e1 v\u00e1rias frentes que valem a explora\u00e7\u00e3o seguinte:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Ajuste fino da configura\u00e7\u00e3o de inst\u00e2ncia:<\/strong> o App Runner permite ajustar CPU e mem\u00f3ria, limites de concorr\u00eancia e comportamento de auto-scaling. Essas op\u00e7\u00f5es s\u00e3o essenciais para otimizar performance e custo conforme o tr\u00e1fego cresce.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Infraestrutura como c\u00f3digo com <a href=\"https:\/\/cheesecakelabs.com\/blog\/estruturar-projeto-terraform-multi-cloud-multi-regiao\/\" id=\"13012\" target=\"_blank\" rel=\"noreferrer noopener\">Terraform<\/a>:<\/strong> gerenciar servi\u00e7os do App Runner, roles do IAM e reposit\u00f3rios do ECR com Terraform melhora reprodutibilidade e governan\u00e7a. Tamb\u00e9m deixa setups com v\u00e1rios ambientes (staging, produ\u00e7\u00e3o) mais f\u00e1ceis de manter e revisar.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Melhorias de seguran\u00e7a:<\/strong> considere trocar as credenciais est\u00e1ticas da AWS no GitHub Actions por autentica\u00e7\u00e3o baseada em OIDC e apertar as permiss\u00f5es do IAM seguindo o princ\u00edpio do menor privil\u00e9gio.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Observabilidade e monitoramento:<\/strong> integre logs, m\u00e9tricas e alarmes do Amazon CloudWatch para ganhar visibilidade sobre o comportamento e a performance da aplica\u00e7\u00e3o.<\/li>\n<\/ul>\n\n\n\n<p>Em resumo, o App Runner \u00e9 um excelente ponto de entrada para rodar <strong>aplica\u00e7\u00f5es FastAPI em n\u00edvel de produ\u00e7\u00e3o na AWS. <\/strong>Conforme os requisitos crescem, voc\u00ea adiciona controle e automa\u00e7\u00e3o aos poucos, sem abrir m\u00e3o da simplicidade que torna o App Runner atraente desde o come\u00e7o.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"http:\/\/cheesecakelabs.com\/services\"><img decoding=\"async\" width=\"1200\" height=\"409\" src=\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2023\/06\/legacy-app-ckl-1200x409.jpg\" alt=\"legacy-app-ckl | | Cheesecake Labs\" class=\"wp-image-13491\" srcset=\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2023\/06\/legacy-app-ckl-1200x409.jpg 1200w, https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2023\/06\/legacy-app-ckl-600x205.jpg 600w, https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2023\/06\/legacy-app-ckl-768x262.jpg 768w, https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2023\/06\/legacy-app-ckl-1536x524.jpg 1536w, https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2023\/06\/legacy-app-ckl-760x259.jpg 760w, https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2023\/06\/legacy-app-ckl.jpg 1920w\" sizes=\"(max-width: 1200px) 100vw, 1200px\" \/><\/a><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Fazer deploy de aplica\u00e7\u00f5es na AWS tem fama: poderoso, flex\u00edvel\u2026 e vez ou outra capaz de transformar uma tarde tranquila em uma aventura inesperada. Entre roles de IAM, imagens de container e decis\u00f5es de rede, \u00e9 f\u00e1cil sentir que voc\u00ea precisa de mapa e b\u00fassola s\u00f3 para colocar um \u201cHello, world\u201d no ar. \u00c9 a\u00ed [&hellip;]<\/p>\n","protected":false},"author":92,"featured_media":13334,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_yoast_wpseo_title":"Deploy de FastAPI no AWS App Runner: guia de produ\u00e7\u00e3o","_yoast_wpseo_metadesc":"Um guia de deploy de FastAPI no AWS App Runner: roles de IAM, imagem de container, cria\u00e7\u00e3o do servi\u00e7o e CI\/CD conectando o GitHub \u00e0 AWS.","_yoast_wpseo_meta-robots-noindex":"","_yoast_wpseo_canonical":"","ai_summary":"O artigo mostra como fazer deploy de uma aplica\u00e7\u00e3o FastAPI no AWS App Runner, que cuida de escala, load balancing e gest\u00e3o de infraestrutura a partir de um container ou reposit\u00f3rio de c\u00f3digo.\nOs pr\u00e9-requisitos na AWS incluem criar um reposit\u00f3rio no Amazon ECR e uma role no IAM com a policy AWSAppRunnerServicePolicyForECRAccess, al\u00e9m de configurar o servi\u00e7o do App Runner com deploy autom\u00e1tico a cada nova imagem enviada.\nO pipeline de CI\/CD usa GitHub Actions com secrets de ambiente (AWS_ACCESS_KEY, AWS_SECRET_ACCESS_KEY, AWS_REGION, ECR_REPOSITORY_URI) para autenticar na AWS, fazer build, tag e push da imagem Docker para o ECR, recomendando permiss\u00f5es m\u00ednimas e, se poss\u00edvel, autentica\u00e7\u00e3o via OIDC.\nA aplica\u00e7\u00e3o \u00e9 adaptada com um Dockerfile usando uv, um entrypoint que sobe o Uvicorn na porta 8080 (que deve coincidir com a porta do App Runner) e um endpoint \/health, com o deploy podendo ser acompanhado pelos logs no console do servi\u00e7o.","ai_summary_en":"","ai_summary_pt-br":"O artigo mostra como fazer deploy de uma aplica\u00e7\u00e3o FastAPI no AWS App Runner, que cuida de escala, load balancing e gest\u00e3o de infraestrutura a partir de um container ou reposit\u00f3rio de c\u00f3digo.\nOs pr\u00e9-requisitos na AWS incluem criar um reposit\u00f3rio no Amazon ECR e uma role no IAM com a policy AWSAppRunnerServicePolicyForECRAccess, al\u00e9m de configurar o servi\u00e7o do App Runner com deploy autom\u00e1tico a cada nova imagem enviada.\nO pipeline de CI\/CD usa GitHub Actions com secrets de ambiente (AWS_ACCESS_KEY, AWS_SECRET_ACCESS_KEY, AWS_REGION, ECR_REPOSITORY_URI) para autenticar na AWS, fazer build, tag e push da imagem Docker para o ECR, recomendando permiss\u00f5es m\u00ednimas e, se poss\u00edvel, autentica\u00e7\u00e3o via OIDC.\nA aplica\u00e7\u00e3o \u00e9 adaptada com um Dockerfile usando uv, um entrypoint que sobe o Uvicorn na porta 8080 (que deve coincidir com a porta do App Runner) e um endpoint \/health, com o deploy podendo ser acompanhado pelos logs no console do servi\u00e7o.","footnotes":"","ckl_wpml_lang":"br","ckl_wpml_source_id":13329,"ckl_wpml_status":"ok: lang=br trid=54884 source=13329 at 2026-08-14 16:46:08"},"categories":[1423,432,471],"tags":[1350,1330,1351],"class_list":["post-14538","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-application-modernization","category-engineering","category-engenharia","tag-app-runner","tag-aws","tag-fastapi"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Deploy de FastAPI no AWS App Runner: guia de produ\u00e7\u00e3o<\/title>\n<meta name=\"description\" content=\"Um guia de deploy de FastAPI no AWS App Runner: roles de IAM, imagem de container, cria\u00e7\u00e3o do servi\u00e7o e CI\/CD conectando o GitHub \u00e0 AWS.\" \/>\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\/br\/deploy-fastapi-aws-app-runner\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Deploy de FastAPI no AWS App Runner: guia de produ\u00e7\u00e3o\" \/>\n<meta property=\"og:description\" content=\"Um guia de deploy de FastAPI no AWS App Runner: roles de IAM, imagem de container, cria\u00e7\u00e3o do servi\u00e7o e CI\/CD conectando o GitHub \u00e0 AWS.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cheesecakelabs.com\/blog\/br\/deploy-fastapi-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-08-15T07:06:58+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=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/deploy-fastapi-aws-app-runner\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/deploy-fastapi-aws-app-runner\/\"},\"author\":{\"name\":\"Diana Martins\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/#\/schema\/person\/37fa2f0fa5f8d3cbaeb21b973fa5c4b9\"},\"headline\":\"Deploy de FastAPI no AWS App Runner: um guia pronto para produ\u00e7\u00e3o\",\"datePublished\":\"2026-01-28T20:11:07+00:00\",\"dateModified\":\"2026-08-15T07:06:58+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/deploy-fastapi-aws-app-runner\/\"},\"wordCount\":1706,\"publisher\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/#organization\"},\"image\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/deploy-fastapi-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\":[\"Application Modernization\",\"Engineering\",\"Engenharia\"],\"inLanguage\":\"pt-BR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/deploy-fastapi-aws-app-runner\/\",\"url\":\"https:\/\/cheesecakelabs.com\/blog\/br\/deploy-fastapi-aws-app-runner\/\",\"name\":\"Deploy de FastAPI no AWS App Runner: guia de produ\u00e7\u00e3o\",\"isPartOf\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/deploy-fastapi-aws-app-runner\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/deploy-fastapi-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-08-15T07:06:58+00:00\",\"description\":\"Um guia de deploy de FastAPI no AWS App Runner: roles de IAM, imagem de container, cria\u00e7\u00e3o do servi\u00e7o e CI\/CD conectando o GitHub \u00e0 AWS.\",\"breadcrumb\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/deploy-fastapi-aws-app-runner\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cheesecakelabs.com\/blog\/br\/deploy-fastapi-aws-app-runner\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/deploy-fastapi-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,\"caption\":\"deploying-fastapi | Cheesecake Labs\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/deploy-fastapi-aws-app-runner\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cheesecakelabs.com\/blog\/br\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Deploy de FastAPI no AWS App Runner: um guia pronto para produ\u00e7\u00e3o\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/#website\",\"url\":\"https:\/\/cheesecakelabs.com\/blog\/br\/\",\"name\":\"Cheesecake Labs\",\"description\":\"Empresa de desenvolvimento e design de aplicativos mobile &amp; web que est\u00e1 reinventando o desenvolvimento de produtos com times remotos. N\u00f3s desenvolvemos aplicativos iOS, Android e aplica\u00e7\u00f5es Web com as melhores empresas dos EUA, do Brasil e do mundo.\",\"publisher\":{\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cheesecakelabs.com\/blog\/br\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/#organization\",\"name\":\"Cheesecake Labs\",\"alternateName\":\"Cheesecake Labs Inc\",\"url\":\"https:\/\/cheesecakelabs.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/cheesecakelabs.com\/#logo\",\"url\":\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2022\/06\/cheesecake-labs-1.png\",\"contentUrl\":\"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2022\/06\/cheesecake-labs-1.png\",\"caption\":\"Cheesecake Labs\",\"inLanguage\":\"br\"},\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/cheesecakelabs.com\/#primary-image\",\"url\":\"https:\/\/ckl-website-v4-strapi-prod.s3.us-east-2.amazonaws.com\/ai_software_development_company_83fb512983.webp\",\"contentUrl\":\"https:\/\/ckl-website-v4-strapi-prod.s3.us-east-2.amazonaws.com\/ai_software_development_company_83fb512983.webp\",\"width\":1920,\"height\":1080,\"caption\":\"Cheesecake Labs \u2014 AI, Data & Blockchain software development services\",\"inLanguage\":\"br\"},\"sameAs\":[\"https:\/\/www.facebook.com\/cheesecakelabs\",\"https:\/\/x.com\/cheesecakelabs\",\"https:\/\/www.instagram.com\/cheesecakelabs\/\",\"https:\/\/www.linkedin.com\/company\/cheesecake-labs\/\",\"https:\/\/www.youtube.com\/channel\/UCdGEQ5AHJcmIlaOaI5fGGVA\",\"https:\/\/clutch.co\/profile\/cheesecake-labs\",\"https:\/\/www.behance.net\/cheesecakelabs\",\"https:\/\/dribbble.com\/cheesecakelabs\",\"https:\/\/www.designrush.com\/agency\/profile\/cheesecake-labs\",\"https:\/\/www.g2.com\/products\/cheesecake-labs\/reviews\"],\"description\":\"Cheesecake Labs is a software development studio that designs and builds custom digital products \u2014 web, mobile, and platforms \u2014 combining product design and high-performance engineering.\",\"foundingDate\":\"2013\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/#\/schema\/person\/37fa2f0fa5f8d3cbaeb21b973fa5c4b9\",\"name\":\"Diana Martins\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/cheesecakelabs.com\/blog\/br\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d074fb633a22723051c9d98ffc13065a28f0b52bd30a4c0a832ee19820caa4ba?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d074fb633a22723051c9d98ffc13065a28f0b52bd30a4c0a832ee19820caa4ba?s=96&d=mm&r=g\",\"caption\":\"Diana Martins\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Deploy de FastAPI no AWS App Runner: guia de produ\u00e7\u00e3o","description":"Um guia de deploy de FastAPI no AWS App Runner: roles de IAM, imagem de container, cria\u00e7\u00e3o do servi\u00e7o e CI\/CD conectando o GitHub \u00e0 AWS.","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\/br\/deploy-fastapi-aws-app-runner\/","og_locale":"pt_BR","og_type":"article","og_title":"Deploy de FastAPI no AWS App Runner: guia de produ\u00e7\u00e3o","og_description":"Um guia de deploy de FastAPI no AWS App Runner: roles de IAM, imagem de container, cria\u00e7\u00e3o do servi\u00e7o e CI\/CD conectando o GitHub \u00e0 AWS.","og_url":"https:\/\/cheesecakelabs.com\/blog\/br\/deploy-fastapi-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-08-15T07:06:58+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":{"Escrito por":null,"Est. tempo de leitura":"11 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/cheesecakelabs.com\/blog\/br\/deploy-fastapi-aws-app-runner\/#article","isPartOf":{"@id":"https:\/\/cheesecakelabs.com\/blog\/br\/deploy-fastapi-aws-app-runner\/"},"author":{"name":"Diana Martins","@id":"https:\/\/cheesecakelabs.com\/blog\/br\/#\/schema\/person\/37fa2f0fa5f8d3cbaeb21b973fa5c4b9"},"headline":"Deploy de FastAPI no AWS App Runner: um guia pronto para produ\u00e7\u00e3o","datePublished":"2026-01-28T20:11:07+00:00","dateModified":"2026-08-15T07:06:58+00:00","mainEntityOfPage":{"@id":"https:\/\/cheesecakelabs.com\/blog\/br\/deploy-fastapi-aws-app-runner\/"},"wordCount":1706,"publisher":{"@id":"https:\/\/cheesecakelabs.com\/blog\/br\/#organization"},"image":{"@id":"https:\/\/cheesecakelabs.com\/blog\/br\/deploy-fastapi-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":["Application Modernization","Engineering","Engenharia"],"inLanguage":"pt-BR"},{"@type":"WebPage","@id":"https:\/\/cheesecakelabs.com\/blog\/br\/deploy-fastapi-aws-app-runner\/","url":"https:\/\/cheesecakelabs.com\/blog\/br\/deploy-fastapi-aws-app-runner\/","name":"Deploy de FastAPI no AWS App Runner: guia de produ\u00e7\u00e3o","isPartOf":{"@id":"https:\/\/cheesecakelabs.com\/blog\/br\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cheesecakelabs.com\/blog\/br\/deploy-fastapi-aws-app-runner\/#primaryimage"},"image":{"@id":"https:\/\/cheesecakelabs.com\/blog\/br\/deploy-fastapi-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-08-15T07:06:58+00:00","description":"Um guia de deploy de FastAPI no AWS App Runner: roles de IAM, imagem de container, cria\u00e7\u00e3o do servi\u00e7o e CI\/CD conectando o GitHub \u00e0 AWS.","breadcrumb":{"@id":"https:\/\/cheesecakelabs.com\/blog\/br\/deploy-fastapi-aws-app-runner\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cheesecakelabs.com\/blog\/br\/deploy-fastapi-aws-app-runner\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/cheesecakelabs.com\/blog\/br\/deploy-fastapi-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,"caption":"deploying-fastapi | Cheesecake Labs"},{"@type":"BreadcrumbList","@id":"https:\/\/cheesecakelabs.com\/blog\/br\/deploy-fastapi-aws-app-runner\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cheesecakelabs.com\/blog\/br\/blog\/"},{"@type":"ListItem","position":2,"name":"Deploy de FastAPI no AWS App Runner: um guia pronto para produ\u00e7\u00e3o"}]},{"@type":"WebSite","@id":"https:\/\/cheesecakelabs.com\/blog\/br\/#website","url":"https:\/\/cheesecakelabs.com\/blog\/br\/","name":"Cheesecake Labs","description":"Empresa de desenvolvimento e design de aplicativos mobile &amp; web que est\u00e1 reinventando o desenvolvimento de produtos com times remotos. N\u00f3s desenvolvemos aplicativos iOS, Android e aplica\u00e7\u00f5es Web com as melhores empresas dos EUA, do Brasil e do mundo.","publisher":{"@id":"https:\/\/cheesecakelabs.com\/blog\/br\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cheesecakelabs.com\/blog\/br\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/cheesecakelabs.com\/blog\/br\/#organization","name":"Cheesecake Labs","alternateName":"Cheesecake Labs Inc","url":"https:\/\/cheesecakelabs.com\/","logo":{"@type":"ImageObject","@id":"https:\/\/cheesecakelabs.com\/#logo","url":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2022\/06\/cheesecake-labs-1.png","contentUrl":"https:\/\/ckl-website-static.s3.amazonaws.com\/wp-content\/uploads\/2022\/06\/cheesecake-labs-1.png","caption":"Cheesecake Labs","inLanguage":"br"},"image":{"@type":"ImageObject","@id":"https:\/\/cheesecakelabs.com\/#primary-image","url":"https:\/\/ckl-website-v4-strapi-prod.s3.us-east-2.amazonaws.com\/ai_software_development_company_83fb512983.webp","contentUrl":"https:\/\/ckl-website-v4-strapi-prod.s3.us-east-2.amazonaws.com\/ai_software_development_company_83fb512983.webp","width":1920,"height":1080,"caption":"Cheesecake Labs \u2014 AI, Data & Blockchain software development services","inLanguage":"br"},"sameAs":["https:\/\/www.facebook.com\/cheesecakelabs","https:\/\/x.com\/cheesecakelabs","https:\/\/www.instagram.com\/cheesecakelabs\/","https:\/\/www.linkedin.com\/company\/cheesecake-labs\/","https:\/\/www.youtube.com\/channel\/UCdGEQ5AHJcmIlaOaI5fGGVA","https:\/\/clutch.co\/profile\/cheesecake-labs","https:\/\/www.behance.net\/cheesecakelabs","https:\/\/dribbble.com\/cheesecakelabs","https:\/\/www.designrush.com\/agency\/profile\/cheesecake-labs","https:\/\/www.g2.com\/products\/cheesecake-labs\/reviews"],"description":"Cheesecake Labs is a software development studio that designs and builds custom digital products \u2014 web, mobile, and platforms \u2014 combining product design and high-performance engineering.","foundingDate":"2013"},{"@type":"Person","@id":"https:\/\/cheesecakelabs.com\/blog\/br\/#\/schema\/person\/37fa2f0fa5f8d3cbaeb21b973fa5c4b9","name":"Diana Martins","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/cheesecakelabs.com\/blog\/br\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/d074fb633a22723051c9d98ffc13065a28f0b52bd30a4c0a832ee19820caa4ba?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d074fb633a22723051c9d98ffc13065a28f0b52bd30a4c0a832ee19820caa4ba?s=96&d=mm&r=g","caption":"Diana Martins"}}]}},"_links":{"self":[{"href":"https:\/\/cheesecakelabs.com\/blog\/br\/wp-json\/wp\/v2\/posts\/14538","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cheesecakelabs.com\/blog\/br\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cheesecakelabs.com\/blog\/br\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cheesecakelabs.com\/blog\/br\/wp-json\/wp\/v2\/users\/92"}],"replies":[{"embeddable":true,"href":"https:\/\/cheesecakelabs.com\/blog\/br\/wp-json\/wp\/v2\/comments?post=14538"}],"version-history":[{"count":3,"href":"https:\/\/cheesecakelabs.com\/blog\/br\/wp-json\/wp\/v2\/posts\/14538\/revisions"}],"predecessor-version":[{"id":15040,"href":"https:\/\/cheesecakelabs.com\/blog\/br\/wp-json\/wp\/v2\/posts\/14538\/revisions\/15040"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cheesecakelabs.com\/blog\/br\/wp-json\/wp\/v2\/media\/13334"}],"wp:attachment":[{"href":"https:\/\/cheesecakelabs.com\/blog\/br\/wp-json\/wp\/v2\/media?parent=14538"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cheesecakelabs.com\/blog\/br\/wp-json\/wp\/v2\/categories?post=14538"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cheesecakelabs.com\/blog\/br\/wp-json\/wp\/v2\/tags?post=14538"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}