ЁЯП╖я╕П рдзрдбрд╛ 10 тАФ Custom domains рдЖрдгрд┐ TLS: рджрд╛рд░рд╛рд╡рд░рдЪрд╛ рдирд╛рд╡рдлрд▓рдХ
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 10 ┬╖ рдорд╛рдЧреЗ: lesson-09-cors ┬╖ рдкреБрдвреЗ: lesson-11-monitoring
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ09, рдЖрдгрд┐ office рд╕рд╛рдареА рдЦрд░реЗ рдирд╛рд╡: AWS рдЪреНрдпрд╛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкрддреНрддреНрдпрд╛рдРрд╡рдЬреА api.school.example
тАФ ACM certificate (рдЖрдгрд┐ рддреЗ рдХреЛрдгрддреНрдпрд╛ Region рдордзреНрдпреЗ рдЕрд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ),
DNS, base path mappings (/v1, /v2), рддреАрди endpoint types,
рдХрд┐рдорд╛рди TLS version рдЖрдгрд┐ mutual TLS. apigw/demo.py рдордзрд▓реЗ
domains() checklist рдЫрд╛рдкрддреЗ, рдЖрдгрд┐ рддреБрдореНрд╣реА lab office рд╕рдореЛрд░ рдПрдХ рдЫреЛрдЯреЗ base
path mapping рдмрд╛рдВрдзрддрд╛.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
Office рдЪрд╛ рдЦрд░рд╛ рдкрддреНрддрд╛ рдореНрд╣рдгрдЬреЗ рдПрдХ рд▓рд╛рдВрдмрд▓рдЪрдХ code: abc123.execute-api.ap-south-1.amazonaws.com.
рддреЛ рдХреЛрдгрд╛рд▓рд╛рдЪ рд▓рдХреНрд╖рд╛рдд рд░рд╛рд╣рдд рдирд╛рд╣реА, рдЖрдгрд┐ рд╢рд╛рд│реЗрдиреЗ рдирд╡реЗ office рдмрд╛рдВрдзрд▓реЗ рддрд░ code рдмрджрд▓рддреЛ рдЖрдгрд┐
рдкреНрд░рддреНрдпреЗрдХ рдкрд╛рд▓рдХрд╛рд▓рд╛ рдирд╡рд╛ code рд╢рд┐рдХрд╛рд╡рд╛ рд▓рд╛рдЧрддреЛ.
рдореНрд╣рдгреВрди рд╢рд╛рд│рд╛ рдлрд╛рдЯрдХрд╛рд╡рд░ рдПрдХ рдирд╛рд╡рдлрд▓рдХ ЁЯП╖я╕П рд▓рд╛рд╡рддреЗ: api.school.example. рдирд╛рд╡рдлрд▓рдХрд╛рдЪреНрдпрд╛ рдорд╛рдЧреЗ рджреЛрди рджрд╛рд░реЗ рдЕрд╕реВ рд╢рдХрддрд╛рдд: /v1 рдЬреБрдиреНрдпрд╛ office рдХрдбреЗ рдЬрд╛рддреЗ рдЖрдгрд┐ /v2 рдирд╡реНрдпрд╛ office рдХрдбреЗ. рдкрд╛рд▓рдХрд╛рдВрд╕рд╛рдареА рдирд╛рд╡ рдХрд╛рдпрдо рддреЗрдЪ рд░рд╛рд╣рддреЗ.
рдирд╛рд╡рдлрд▓рдХ рдЦрд░реЛрдЦрд░ рд╢рд╛рд│реЗрдЪрд╛рдЪ рдЖрд╣реЗ рд╣реЗ рд╕рд┐рджреНрдз рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдлрд╛рдЯрдХ рдПрдХ certificate рджрд╛рдЦрд╡рддреЗ тАФ рд╡рд┐рд╢реНрд╡рд╛рд╕реВ office рдиреЗ рд╕рд╣реА рдХреЗрд▓реЗрд▓рд╛ рдХрд╛рдЧрдж (TLS certificate). рдХрд╛рд╣реА partner рд╢рд╛рд│рд╛рдВрдирд╛ рдЖрдд рдпреЗрдгреНрдпрд╛рдЖрдзреА рддреНрдпрд╛рдВрдЪреЗ рд╕реНрд╡рддрдГрдЪреЗ certificate рд╕реБрджреНрдзрд╛ рджрд╛рдЦрд╡рд╛рд╡реЗ рд▓рд╛рдЧрддреЗ тАФ рд╣реЗрдЪ mutual TLS.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
user["ЁЯЩЛ https://api.school.example/v1/students/7"] --> dns["ЁЯУЦ Route 53 alias<br/>api.school.example"]
dns --> dom["ЁЯП╖я╕П custom domain<br/>ACM certificate ┬╖ TLS 1.2 minimum"]
dom -->|"base path /v1"| a1["ЁЯЫОя╕П school-api ┬╖ prod"]
dom -->|"base path /v2"| a2["ЁЯЫОя╕П school-api-v2 ┬╖ prod"]
dom -.->|"no mapping for /students/7"| no["ЁЯЪл 403"]
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрдХреГрддреА + рдПрдХ lab: https://school-edh.pages.dev/apigateway/lesson-diagrams.html#l10
тЭУ рдХрд╛рдп
- Custom domain name тАФ рддреБрдордЪреНрдпрд╛ рдорд╛рд▓рдХреАрдЪреЗ рдирд╛рд╡ (
api.school.example) рдЬреЗ рддреБрдордЪреНрдпрд╛ API stages рдХрдбреЗ рдирд┐рд░реНрджреЗрд╢ рдХрд░рддреЗ. Defaultexecute-apiрдкрддреНрддрд╛ рддреБрдореНрд╣реА disable рдХрд░реЗрдкрд░реНрдпрдВрдд рдЪрд╛рд▓реВрдЪ рд░рд╛рд╣рддреЛ. - Endpoint types тАФ
- edge-optimized (рдлрдХреНрдд REST): requests CloudFront рдЪреНрдпрд╛ edge network рдордзреВрди рдЖрдд рдпреЗрддрд╛рдд, рдЬрдЧрднрд░ рдкрд╕рд░рд▓реЗрд▓реНрдпрд╛ clients рд╕рд╛рдареА рдЪрд╛рдВрдЧрд▓реЗ;
- regional: requests рдереЗрдЯ Region рдордзреНрдпреЗ рдЬрд╛рддрд╛рдд тАФ clients рддреНрдпрд╛рдЪ Region рдордзреНрдпреЗ рдЕрд╕рддреАрд▓ рдХрд┐рдВрд╡рд╛ рддреБрдореНрд╣реА рд╕рдореЛрд░ рд╕реНрд╡рддрдГрдЪреЗ CloudFront рдареЗрд╡рдд рдЕрд╕рд╛рд▓ рддреЗрд╡реНрд╣рд╛ рд╕рд░реНрд╡реЛрддреНрддрдо;
- private (рдлрдХреНрдд REST): рдлрдХреНрдд VPC рдЪреНрдпрд╛ рдЖрддреВрдирдЪ рдкреЛрд╣реЛрдЪрддрд╛ рдпреЗрддреЗ (рдзрдбрд╛ 12).
- Certificate тАФ AWS Certificate Manager (ACM) рдХрдбреВрди. edge-optimized рд╕рд╛рдареА рддреЗ us-east-1 рдордзреНрдпреЗрдЪ рд╣рд╡реЗ; regional рд╕рд╛рдареА рддреЗ API рдЪреНрдпрд╛ рддреНрдпрд╛рдЪ Region рдордзреНрдпреЗ рд╣рд╡реЗ.
- DNS тАФ domain рдЪреНрдпрд╛ target рдХрдбреЗ рдЬрд╛рдгрд╛рд░рд╛ Route 53 alias record (A / AAAA): edge-optimized рд╕рд╛рдареА
CloudFront рдирд╛рд╡, regional рд╕рд╛рдареА
d-тАж.execute-apiтАжregional рдирд╛рд╡. - Base path mapping (REST, v2 API рдордзреНрдпреЗ "API mappings") тАФ
/v1тЖТ API + stage,/v2тЖТ рджреБрд╕рд░рд╛ API + stage. рд░рд┐рдХрд╛рдорд╛ base path рд╕рдВрдкреВрд░реНрдг domain рдПрдХрд╛рдЪ API рдХрдбреЗ рдиреЗрддреЛ. - Security policy тАФ domain рд╕реНрд╡реАрдХрд╛рд░рддреЛ рддреЗ рдХрд┐рдорд╛рди TLS version. TLS 1.2
(
TLS_1_2) рдирд┐рд╡рдбрд╛. - Mutual TLS (mTLS) тАФ regional custom domains рд╡рд░, clients рдиреА рддреБрдордЪреНрдпрд╛ truststore рдордзрд▓реНрдпрд╛ (S3 рдордзрд▓реА PEM file) CA рдиреЗ рд╕рд╣реА рдХреЗрд▓реЗрд▓реЗ certificate рджрд╛рдЦрд╡рд╛рдпрд▓рд╛рдЪ рд╣рд╡реЗ. Partners рдЖрдгрд┐ devices рд╕рд╛рдареА рдЪрд╛рдВрдЧрд▓реЗ.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг рдкрддреНрддрд╛ рдореНрд╣рдгрдЬреЗ рдкреНрд░рддреНрдпреЗрдХ client рд▓рд╛ рджрд┐рд▓реЗрд▓реЗ рд╡рдЪрди. Custom domain рдореБрд│реЗ рддреБрдореНрд╣реА рдирд╡реНрдпрд╛
API рдХрдбреЗ, рдирд╡реНрдпрд╛ Region рдХрдбреЗ рдХрд┐рдВрд╡рд╛ рдирд╡реНрдпрд╛ рдкреНрд░рдХрд╛рд░рд╛рдХрдбреЗ (REST рддреЗ HTTP) рдЬрд╛рдК рд╢рдХрддрд╛, рдХреЛрдгрд╛рд▓рд╛рд╣реА рддреНрдпрд╛рдВрдЪрд╛
code рдмрджрд▓рд╛рдпрд▓рд╛ рди рд╕рд╛рдВрдЧрддрд╛. Base paths рдореБрд│реЗ clients рд╣рд│реВрд╣рд│реВ рд╕рд░рдХрдд рдЕрд╕рддрд╛рдирд╛ v1 рдЖрдгрд┐ v2 рд╢реЗрдЬрд╛рд░реА рд╢реЗрдЬрд╛рд░реА рд░рд╛рд╣реВ рд╢рдХрддрд╛рдд. рдЖрдгрд┐ TLS
settings рдард░рд╡рддрд╛рдд рдХреА рдХреЛрдгрддреЗ рдЬреБрдиреЗ, рдХрдордХреБрд╡рдд clients рддреБрдореНрд╣реА рдЕрдЬреВрдирд╣реА рд╕реНрд╡реАрдХрд╛рд░рддрд╛.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
Lab рдордзреНрдпреЗ DNS рдХрд┐рдВрд╡рд╛ certificates рдирд╛рд╣реАрдд, рдореНрд╣рдгреВрди apigw/demo.py рдордзрд▓реЗ
domains() checklist рдЫрд╛рдкрддреЗ. рддреБрдореНрд╣реА рдЪрд╛рд▓рд╡реВ рд╢рдХрддрд╛ рддреЛ рднрд╛рдЧ рдореНрд╣рдгрдЬреЗ
base path mapping: Gateway.handle() рд╕рдореЛрд░рдЪреЗ рдПрдХ рдЫреЛрдЯреЗрд╕реЗ function рдЬреЗ path рдЪреНрдпрд╛ рдкрд╣рд┐рд▓реНрдпрд╛ рднрд╛рдЧрд╛рд╡рд░реВрди API рдЖрдгрд┐
stage рдирд┐рд╡рдбрддреЗ, рддреЛ рднрд╛рдЧ рдХрд╛рдвреВрди рдЯрд╛рдХрддреЗ, рдЖрдгрд┐ рдЙрд░рд▓реЗрд▓реЗ рдкреБрдвреЗ рдкрд╛рдард╡рддреЗ тАФ custom
domain рдЪреЗ mappings рдиреЗрдордХреЗ рд╣реЗрдЪ рдХрд╛рдо рдХрд░рддрд╛рдд.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 apigw/demo.py domains
python3 - <<'EOF'
import sys; sys.path.insert(0, "apigw"); from demo import office
v1, _ = office()
MAPPINGS = {"/v1": (v1, "prod"), "/v1-dev": (v1, "dev")} # api.school.example/<base path> тЖТ (API, stage)
def custom_domain(method, url_path):
for base in sorted(MAPPINGS, key=len, reverse=True):
if url_path.startswith(base + "/"):
api, stage = MAPPINGS[base]
return api.handle(method, url_path[len(base):], stage=stage)
return 403, {}, {"message": "Forbidden"}
for p in ("/v1/students/7", "/v1-dev/students/9", "/v2/students/7", "/students/7"):
st, _, out = custom_domain("GET", p); print(f"api.school.example{p:<18} тЖТ {st} {out}")
EOF
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
domains рдкрд╛рдЪ рдУрд│реА рдЫрд╛рдкрддреЗ, рддреНрдпрд╛рдВрдкреИрдХреА
certificate ACM тАФ in us-east-1 for edge-optimized, in the API's Region for regional,
base path mapping api.school.example/v1 тЖТ school-api prod ┬╖ /v2 тЖТ school-api-v2 prod рдЖрдгрд┐
TLS security policy TLS 1.2 minimum ┬╖ mutual TLS for partners with client certificates.
рддреБрдордЪрд╛ snippet рд╣реЗ рдЫрд╛рдкрддреЛ:
api.school.example/v1/students/7 тЖТ 200 {'id': '7', 'name': 'Aishwarya', 'class': '8B'}
api.school.example/v1-dev/students/9 тЖТ 200 {'id': '9', 'name': 'Katrina', 'class': '9A'}
api.school.example/v2/students/7 тЖТ 403 {'message': 'Forbidden'}
api.school.example/students/7 тЖТ 403 {'message': 'Forbidden'}
/v2 рд▓рд╛ рдЕрдЬреВрди mapping рдирд╛рд╣реА, рдЖрдгрд┐ base path рдирд╕рд▓реЗрд▓рд╛ path рдХрд╢рд╛рд╢реАрдЪ рдЬреБрд│рдд рдирд╛рд╣реА.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рдПрдХ рдирд╛рд╡ рдЕрдиреЗрдХ APIs рдЖрдгрд┐ stages рдХрдбреЗ рдиреЗрдК рд╢рдХрддреЗ; base path рджрд╛рд░ рдирд┐рд╡рдбрддреЛ, рдЖрдгрд┐ рдорд╛рдЧрдЪреНрдпрд╛ API рд▓рд╛ base path рдХрдзреА рджрд┐рд╕рддрдЪ рдирд╛рд╣реА.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- edge-optimized domain рдЪреЗ certificate us-east-1 рдРрд╡рдЬреА API рдЪреНрдпрд╛ Region рдордзреНрдпреЗ рдмрдирд╡рдгреЗ
- custom domain рдЪреНрдпрд╛ target рдХрдбреЗ alias рдРрд╡рдЬреА
execute-apiрдкрддреНрддреНрдпрд╛рдХрдбреЗ CNAME тАФ TLS рдЕрдкрдпрд╢реА рдард░рддреЗ - default
execute-apiendpoint рдЙрдШрдбрд╛ рдареЗрд╡рдгреЗ, рддреНрдпрд╛рдореБрд│реЗ callers custom domain рдорд╛рд░реНрдЧрд╛рд╡рд░рдЪреЗ mTLS рдХрд┐рдВрд╡рд╛ WAF рдЯрд╛рд│рддрд╛рдд - "рдЬреБрдиреНрдпрд╛ clients рд╕рд╛рдареА" TLS 1.0 рд▓рд╛ рдкрд░рд╡рд╛рдирдЧреА рджреЗрдгреЗ рдЖрдгрд┐ рддреА рдХрдзреАрдЪ рди рдХрд╛рдврдгреЗ
- edge-optimized domain рд╡рд░ mTLS тАФ рддреНрдпрд╛рд╕рд╛рдареА regional domain рд▓рд╛рдЧрддреЛ
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд
рдЦрд▒реНрдпрд╛ account рд╡рд░ тАФ TLS 1.2 рд╕рд╣ regional custom domain, /v1 mapping, рдЖрдгрд┐ DNS:
aws apigateway create-domain-name --domain-name api.school.example \
--regional-certificate-arn arn:aws:acm:ap-south-1:111122223333:certificate/1234abcd-12ab-34cd-56ef-1234567890ab \
--endpoint-configuration types=REGIONAL --security-policy TLS_1_2
aws apigateway create-base-path-mapping --domain-name api.school.example \
--rest-api-id abc123 --stage prod --base-path v1
aws apigateway get-domain-name --domain-name api.school.example \
--query '{target:regionalDomainName,zone:regionalHostedZoneId}'
Partners рд╕рд╛рдареА mutual TLS (S3 рдордзреНрдпреЗ truststore):
aws apigateway create-domain-name --domain-name partners.school.example \
--regional-certificate-arn arn:aws:acm:ap-south-1:111122223333:certificate/1234abcd-12ab-34cd-56ef-1234567890ab \
--endpoint-configuration types=REGIONAL --security-policy TLS_1_2 \
--mutual-tls-authentication truststoreUri=s3://school-truststore/partners.pem
Terraform (HTTP API mapping):
resource "aws_apigatewayv2_api_mapping" "v1" {
api_id = aws_apigatewayv2_api.school.id
domain_name = aws_apigatewayv2_domain_name.api.id
stage = aws_apigatewayv2_stage.prod.id
api_mapping_key = "v1"
}
ЁЯПн Production рдордзреНрдпреЗ рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ: рдлрдХреНрдд custom domain рдкреНрд░рд╕рд┐рджреНрдз рдХрд░рд╛, clients рд╕рд░рдХрд▓реНрдпрд╛рд╡рд░ default endpoint disable рдХрд░рд╛, рдХрд┐рдорд╛рди TLS 1.2 рдареЗрд╡рд╛, рдЖрдгрд┐ ACM рд▓рд╛ certificate renew рдХрд░реВ рджреНрдпрд╛ тАФ validation рдХрдзреА рдЕрдкрдпрд╢реА рдард░рд▓реЗ рддрд░ alarm рд╕рд╣.
тПня╕П рдкреБрдвреЗ
Office рд▓рд╛ рдирд╛рд╡ рдорд┐рд│рд╛рд▓реЗ. рдЖрддрд╛: рддреЗ рдирд┐рд░реЛрдЧреА рдЖрд╣реЗ рд╣реЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╕реЗ рдХрд│рдгрд╛рд░? Dashboard рдЖрдгрд┐ stopwatch тАФ monitoring.
git checkout lesson-11-monitoring