I'm going to build microservices' architecture on AWS and I want to ask you to clarify my doubts.
My current general concept
I would like to use API Gateway, which exposes microsevices' APIs running in Elastic Beanstalk. I would like to place the Elastic Beanstalk in VPC without direct access from Internet to its instances.
Questions & Doubts:
I'll answer the points that are not opinion based:
- Elastic Beanstalk gets subdomain on application creation. This subdomain should be used by API Gateway with integration type: AWS service, in action configuration - Am I right?
No, AWS service integration would only apply if you were actually calling the Elastic Beanstalk service. You would be calling your own beanstalk instance so you would use HTTP integration.
- What would represent a single microservice? An Elastic Beanstalk's application is a specific scalable microservice?
This is up to you, but as mentioned in comments, many customers choose to do this via Lambda functions rather than beanstalk applications. Using Lambda has the benefit that you do not need to managed the scaling of your beanstalk application.
- Test environment: What structure should I use in test environment (or staging env.)? I think about creating separate VPC with another Elastic Beanstalk and other Amazon services.
Just a note here, API Gateway cannot contact resources in your VPC currently. Any beanstalk instance would need to be publically accessible.
- Test environment and API Gateway: How should I set up an API Gateway? It should allow clients to access the microservices in test environment if request has specific subdomain, like: test.mydomain.com/hello_world/say_hello. I'm not sure how to use API Gateway in CI/CD to make it fast and simple, without manual copying some configuration from test stage to the production stage. (I'm not expecting any complex solution, only some hints about what components, parts, concepts could I use for it. More details I'll find on my own).
You should take a look at stage variables. This would allow you to use basic configuration with differences between dev/test/prod stored in these variables.