{"id":15968886,"url":"https://github.com/zkfmapf123/api-gateway-pubsub-pattern","last_synced_at":"2026-04-26T12:32:16.521Z","repository":{"id":255958511,"uuid":"853656153","full_name":"zkfmapf123/api-gateway-pubsub-pattern","owner":"zkfmapf123","description":"api-gateway + SQS Pub/Sub Pattern","archived":false,"fork":false,"pushed_at":"2024-09-08T07:58:58.000Z","size":955,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-04T14:30:55.451Z","etag":null,"topics":["api-gateway","aws","eventbridge","pubsub","sqs"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zkfmapf123.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-09-07T06:41:34.000Z","updated_at":"2024-09-08T09:11:53.000Z","dependencies_parsed_at":null,"dependency_job_id":"5618340a-b3c9-4ac0-a4df-96fe607aee87","html_url":"https://github.com/zkfmapf123/api-gateway-pubsub-pattern","commit_stats":null,"previous_names":["zkfmapf123/api-gateway-pubsub-pattern"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/zkfmapf123/api-gateway-pubsub-pattern","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zkfmapf123%2Fapi-gateway-pubsub-pattern","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zkfmapf123%2Fapi-gateway-pubsub-pattern/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zkfmapf123%2Fapi-gateway-pubsub-pattern/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zkfmapf123%2Fapi-gateway-pubsub-pattern/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zkfmapf123","download_url":"https://codeload.github.com/zkfmapf123/api-gateway-pubsub-pattern/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zkfmapf123%2Fapi-gateway-pubsub-pattern/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32297893,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-26T09:34:17.070Z","status":"ssl_error","status_checked_at":"2026-04-26T09:34:00.993Z","response_time":129,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api-gateway","aws","eventbridge","pubsub","sqs"],"created_at":"2024-10-07T19:04:22.739Z","updated_at":"2026-04-26T12:32:16.501Z","avatar_url":"https://github.com/zkfmapf123.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# API Gateway Pub/Sub Pattern\n\n## Desc\n- 기존 Server to Server 통신을 Gateway + Queue 통신으로 수정\n- 통신 방식을 수정함으로써, Server 간의 Coupling을 낮춰 안정적인 데이터 송/수신 보장\n\n## ASIS\n\n![asis](./public/asis.png)\n\n- Call Server To Server \n- Sub Server가 죽으면 데이터 유실 + 503 (Server Unavailable)\n\n- Pub Server Host : pub.leedonggyu.com\n- Sub Server Host : sub.leeodnggyu.com\n\n## TOBE\n\n![tobe](./public/tobe.png)\n\n- Call Pub Server -\u003e Proxy Gateway -\u003e Messaging Queue -\u003e Sub Server\n- Sub Server가 죽어도 SQS에서 Queueing 동작하도록 구성\n\n- Pub Server Host : pub.leedonggyu.com\n- GW Server Host : sub-gw.leedonggyu.com\n- Sub Server Host : sub.leedonggyu.com \n\n## In Code\n\n```javascript\n\n// pub code\napp.get(\"/pub\", async (req,res) =\u003e {\n    let statusCode = 200\n    \n    try{\n        const result = await axios.post(SUB_HOST, {\n            body : {\n                id : uuidv4(),\n                name : \"leedonggyu\",\n                age : 31,\n                job : \"devops\"\n            }\n        })\n\n        console.log(`Success \u003e\u003e ${result.status}`)\n\n    }catch(e){\n        console.error(e)\n        statusCode = 500\n        // ignore\n    }\n\n    return res.status(statusCode).json({})\n})\n```\n\n```javascript\n\n// sub code\napp.post(\"/sub\",async (req,res) =\u003e{\n   \n    console.log(\"body : \",  JSON.stringify(req))\n\n    const {id} = req\n    try{\n        \n        // S3 에 저장\n        const command=  new PutObjectCommand({\n            Bucket  : \"donggyu-test-poc\",\n            Key : id,\n            Body : JSON.stringify(req.body)\n        })\n\n        const result = await client.send(command)\n        console.log(\"result \u003e\u003e \", result)\n    }catch(e) {\n        console.error(e)\n        // ignore\n    }\n\n    return res.status(200).json({})\n})\n```\n\n## API-Gateway + SQS\n\n### IAM Role 만들기\n![role-1](./public/role-1.png)\n![role-2](./public/role-2.png)\n\n### API Gateway + SQS 연동하기\n![gw-1](./public/1.png)\n![gw-2](./public/2.png)\n![gw-3](./public/gw-3.png)\n![gw-4](./public/gw-4.png)\n![gw-5](./public/gw-5.png)\n![gw-6](./public/gw-6.png)\n\n### API Gateway 사용자 지정 도메인\n\n![gw-7](./public/gw-7.png)\n\n- API Mapping 에서 Stage 별로 따로 Domain 구성해야 함\n\n### EventBridge Pipe 설정\n\n![eda-1](./public/eda-1.png)\n![eda-2](./public/eda-2.png)\n\n### Result\n![result](./public/result.png)\n\n## Reference\n\n- \u003ca href=\"https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis.html\"\u003e API Gateway + SQS \u003c/a\u003e\n\n- \u003ca href=\"https://docs.aws.amazon.com/ko_kr/eventbridge/latest/userguide/eb-pipes-input-transformation.html\"\u003e Event Bridge Pipe 변환 \u003c/a\u003e\n\n\n```sh\n    curl -X POST https://sub-gw.leedonggyu.com/events/sub \\\n    -H \"Content-Type: application/json\" \\\n    -d '{\"id\": 10, \"age\" : 31, \"name\": \"leedonggyu\", \"job\": \"devops\"}'\n```\n\n## ...\n\n- \u003cb\u003e Thanks to my \"K\" \u003c/b\u003e","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzkfmapf123%2Fapi-gateway-pubsub-pattern","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzkfmapf123%2Fapi-gateway-pubsub-pattern","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzkfmapf123%2Fapi-gateway-pubsub-pattern/lists"}