aws api gateway 介紹
- api的網(wǎng)關。主要目的是用來控制api的。
- 所有api都可以寫如到api gateway中。
- 在api gateway中控制api的調用次數(shù),吞吐量,是否允許調用
- 在 api gateway中控制這個API 觸發(fā)的aws的服務
swagger 介紹
- 用來編寫API文檔,有專門的swagger語法。簡單點說就是用文字信息和特定的格式來描述一個API
swagger集成 api gateway
介紹
- swagger網(wǎng)站上有關于集成api gateway的功能??梢宰龅揭绘I集成(注意,集成的時候最好選則overwrite,每次保存都會完整的更新api gateway)
- 所有api gateway的功能,包括authorized response lambda 都可以用swagger文檔來完成。最后一鍵集成到api Gateway中
如何集成
- google一下swagger,注冊swagger hub的賬號。
- 編寫swagger的文檔
- 找到 Integrations按鈕(藏的有點深,我找了半天),選擇集成 aws api gateway
- 配置好aws 的key和secret 保存并執(zhí)行。這樣以后每次編寫swagger文檔都會更新api gateway了
swagger的編寫(yaml格式)
- swagger 文檔如何編寫我這里就不說了,自行google,多嘗試就OK了。在swagger官網(wǎng)中編寫會有錯誤提示,還是比較方便的。
這篇文章主要介紹的是和api gateway相關的內容
- swagger集成api gateway的文檔例子
https://github.com/aws-samples/api-gateway-secure-pet-store/blob/master/src/main/resources/swagger.yaml
# this is an example of the Uber API
# as a demonstration of an API spec in YAML
swagger: '2.0'
info:
title: API Gateway Secure Pet Store
description: Pet store sample that uses Cognito Developer Authenticated Identities to generate credentials through a Java Lambda Function
version: "1.0.0"
# the domain of the service
host: execute-api.us-east-1.amazonaws.com
# array of all schemes that your API supports
schemes:
- https
# will be prefixed to all paths
basePath: /
produces:
- application/json
paths:
/users:
post:
summary: Registers a new user
description: |
Creates a new user in the DynamoDB backend database and returns a set
of temporary credentials to sign future requests.
consumes:
- application/json
produces:
- application/json
parameters:
- name: NewUser
in: body
description: New user details.
schema:
$ref: '#/definitions/User'
tags:
- Auth
x-amazon-apigateway-integration:
type: aws
uri: arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:XXXXXXXXXXXX:function:YOUR_FUNCTION_NAME/invocations
credentials: arn:aws:iam::XXXXXXXXXXXX:role/YOUR_LAMBDA_INVOCATION_ROLE
httpMethod: POST
requestTemplates:
application/json: |
{
"action" : "com.amazonaws.apigatewaydemo.action.RegisterDemoAction",
"body" : $input.json('$')
}
responses:
"default":
statusCode: "200"
responseParameters:
method.response.header.Access-Control-Allow-Origin : "'*'"
"BAD.*":
statusCode: "400"
responseParameters:
method.response.header.Access-Control-Allow-Origin : "'*'"
"INT.*":
statusCode: "500"
responseParameters:
method.response.header.Access-Control-Allow-Origin : "'*'"
responses:
200:
description: The username of the new user and set of temporary credentials
headers:
Access-Control-Allow-Origin:
type: "string"
schema:
$ref: '#/definitions/RegisterUserResponse'
400:
description: Bad request
headers:
Access-Control-Allow-Origin:
type: "string"
schema:
$ref: '#/definitions/Error'
500:
description: Internal error
headers:
Access-Control-Allow-Origin:
type: "string"
schema:
$ref: '#/definitions/Error'
options:
summary: CORS support
description: |
Enable CORS by returning correct headers
consumes:
- application/json
produces:
- application/json
tags:
- CORS
x-amazon-apigateway-integration:
type: mock
requestTemplates:
application/json: |
{
"statusCode" : 200
}
responses:
"default":
statusCode: "200"
responseParameters:
method.response.header.Access-Control-Allow-Headers : "'Content-Type,X-Amz-Date,Authorization,X-Api-Key'"
method.response.header.Access-Control-Allow-Methods : "'*'"
method.response.header.Access-Control-Allow-Origin : "'*'"
responseTemplates:
application/json: |
{}
responses:
200:
description: Default response for CORS method
headers:
Access-Control-Allow-Headers:
type: "string"
Access-Control-Allow-Methods:
type: "string"
Access-Control-Allow-Origin:
type: "string"
/login:
post:
summary: Login user
description: |
Verifies the given credentials against the user database and returns a set
of new temporary credentials
consumes:
- application/json
produces:
- application/json
parameters:
- name: LoginUser
in: body
description: New user details.
schema:
$ref: '#/definitions/User'
tags:
- Auth
x-amazon-apigateway-integration:
type: aws
uri: arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:XXXXXXXXXXXX:function:YOUR_FUNCTION_NAME/invocations
credentials: arn:aws:iam::XXXXXXXXXXXX:role/YOUR_LAMBDA_INVOCATION_ROLE
httpMethod: POST
requestTemplates:
application/json: |
{
"action" : "com.amazonaws.apigatewaydemo.action.LoginDemoAction",
"body" : $input.json('$')
}
responses:
"default":
statusCode: "200"
responseParameters:
method.response.header.Access-Control-Allow-Origin : "'*'"
"BAD.*":
statusCode: "400"
responseParameters:
method.response.header.Access-Control-Allow-Origin : "'*'"
"INT.*":
statusCode: "500"
responseParameters:
method.response.header.Access-Control-Allow-Origin : "'*'"
responses:
200:
description: A new set of temporary credentials
headers:
Access-Control-Allow-Origin:
type: "string"
schema:
$ref: '#/definitions/LoginUserResponse'
400:
description: Bad request
headers:
Access-Control-Allow-Origin:
type: "string"
schema:
$ref: '#/definitions/Error'
500:
description: Internal error
headers:
Access-Control-Allow-Origin:
type: "string"
schema:
$ref: '#/definitions/Error'
options:
summary: CORS support
description: |
Enable CORS by returning correct headers
consumes:
- application/json
produces:
- application/json
tags:
- CORS
x-amazon-apigateway-integration:
type: mock
requestTemplates:
application/json: |
{
"statusCode" : 200
}
responses:
"default":
statusCode: "200"
responseParameters:
method.response.header.Access-Control-Allow-Headers : "'Content-Type,X-Amz-Date,Authorization,X-Api-Key'"
method.response.header.Access-Control-Allow-Methods : "'*'"
method.response.header.Access-Control-Allow-Origin : "'*'"
responseTemplates:
application/json: |
{}
responses:
200:
description: Default response for CORS method
headers:
Access-Control-Allow-Headers:
type: "string"
Access-Control-Allow-Methods:
type: "string"
Access-Control-Allow-Origin:
type: "string"
/pets:
post:
summary: Creates a new pet
description: |
Creates a new pet object in the datastore
x-amazon-apigateway-auth:
type: aws_iam
consumes:
- application/json
produces:
- application/json
parameters:
- name: NewPet
in: body
description: New pet details.
schema:
$ref: '#/definitions/NewPet'
tags:
- Pet Store
x-amazon-apigateway-integration:
type: aws
uri: arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:XXXXXXXXXXXX:function:YOUR_FUNCTION_NAME/invocations
credentials: arn:aws:iam::*:user/*
httpMethod: POST
requestTemplates:
application/json: |
{
"action" : "com.amazonaws.apigatewaydemo.action.CreatePetDemoAction",
"body" : $input.json('$')
}
responses:
"default":
statusCode: "200"
responseParameters:
method.response.header.Access-Control-Allow-Origin : "'*'"
"BAD.*":
statusCode: "400"
responseParameters:
method.response.header.Access-Control-Allow-Origin : "'*'"
"INT.*":
statusCode: "500"
responseParameters:
method.response.header.Access-Control-Allow-Origin : "'*'"
responses:
200:
description: The unique identifier of the new pet
headers:
Access-Control-Allow-Origin:
type: "string"
schema:
$ref: '#/definitions/NewPetResponse'
400:
description: Bad request
headers:
Access-Control-Allow-Origin:
type: "string"
schema:
$ref: '#/definitions/Error'
500:
description: Internal error
headers:
Access-Control-Allow-Origin:
type: "string"
schema:
$ref: '#/definitions/Error'
get:
summary: List pets
description: Retrieve a list of pets in the store
x-amazon-apigateway-auth:
type: aws_iam
consumes:
- application/json
produces:
- application/json
tags:
- Pet Store
x-amazon-apigateway-integration:
type: aws
uri: arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:XXXXXXXXXXXX:function:YOUR_FUNCTION_NAME/invocations
credentials: arn:aws:iam::*:user/*
httpMethod: POST
requestTemplates:
application/json: |
{
"action" : "com.amazonaws.apigatewaydemo.action.ListPetsDemoAction",
"body" : $input.json('$')
}
responses:
"default":
statusCode: "200"
responseParameters:
method.response.header.Access-Control-Allow-Origin : "'*'"
"BAD.*":
statusCode: "400"
responseParameters:
method.response.header.Access-Control-Allow-Origin : "'*'"
"INT.*":
statusCode: "500"
responseParameters:
method.response.header.Access-Control-Allow-Origin : "'*'"
responses:
200:
description: A list of pets
headers:
Access-Control-Allow-Origin:
type: "string"
schema:
$ref: '#/definitions/Pets'
400:
description: Bad request
headers:
Access-Control-Allow-Origin:
type: "string"
schema:
$ref: '#/definitions/Error'
500:
description: Internal error
headers:
Access-Control-Allow-Origin:
type: "string"
schema:
$ref: '#/definitions/Error'
options:
summary: CORS support
description: |
Enable CORS by returning correct headers
consumes:
- application/json
produces:
- application/json
tags:
- CORS
x-amazon-apigateway-integration:
type: mock
requestTemplates:
application/json: |
{
"statusCode" : 200
}
responses:
"default":
statusCode: "200"
responseParameters:
method.response.header.Access-Control-Allow-Headers : "'Content-Type,X-Amz-Date,Authorization,X-Api-Key'"
method.response.header.Access-Control-Allow-Methods : "'*'"
method.response.header.Access-Control-Allow-Origin : "'*'"
responseTemplates:
application/json: |
{}
responses:
200:
description: Default response for CORS method
headers:
Access-Control-Allow-Headers:
type: "string"
Access-Control-Allow-Methods:
type: "string"
Access-Control-Allow-Origin:
type: "string"
/pets/{petId}:
get:
summary: Get pet by id
description: Returns a pet definition based on the given id
x-amazon-apigateway-auth:
type: aws_iam
consumes:
- application/json
produces:
- application/json
tags:
- Pet Store
parameters:
- name: petId
in: path
description: The unique identifier for a pet
type: string
x-amazon-apigateway-integration:
type: aws
uri: arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:XXXXXXXXXXXX:function:YOUR_FUNCTION_NAME/invocations
credentials: arn:aws:iam::*:user/*
httpMethod: POST
requestTemplates:
application/json: |
{
"action" : "com.amazonaws.apigatewaydemo.action.GetPetDemoAction",
"body" : {
"petId" : "$input.params('petId')"
}
}
responses:
"default":
statusCode: "200"
responseParameters:
method.response.header.Access-Control-Allow-Origin : "'*'"
"BAD.*":
statusCode: "400"
responseParameters:
method.response.header.Access-Control-Allow-Origin : "'*'"
"INT.*":
statusCode: "500"
responseParameters:
method.response.header.Access-Control-Allow-Origin : "'*'"
responses:
200:
description: A pet
headers:
Access-Control-Allow-Origin:
type: "string"
schema:
$ref: '#/definitions/Pet'
400:
description: Bad request
headers:
Access-Control-Allow-Origin:
type: "string"
schema:
$ref: '#/definitions/Error'
500:
description: Internal error
headers:
Access-Control-Allow-Origin:
type: "string"
schema:
$ref: '#/definitions/Error'
options:
summary: CORS support
description: |
Enable CORS by returning correct headers
consumes:
- application/json
produces:
- application/json
tags:
- CORS
x-amazon-apigateway-integration:
type: mock
requestTemplates:
application/json: |
{
"statusCode" : 200
}
responses:
"default":
statusCode: "200"
responseParameters:
method.response.header.Access-Control-Allow-Headers : "'Content-Type,X-Amz-Date,Authorization,X-Api-Key'"
method.response.header.Access-Control-Allow-Methods : "'*'"
method.response.header.Access-Control-Allow-Origin : "'*'"
responseTemplates:
application/json: |
{}
responses:
200:
description: Default response for CORS method
headers:
Access-Control-Allow-Headers:
type: "string"
Access-Control-Allow-Methods:
type: "string"
Access-Control-Allow-Origin:
type: "string"
definitions:
User:
properties:
username:
type: string
description: A unique username for the user
password:
type: string
description: A password for the new user
RegisterUserResponse:
properties:
username:
type: string
description: The username of the new user
identityId:
type: string
description: The unique identifier for the new user
token:
type: string
description: An OpenID token for the new user
credentials:
type: object
properties:
accessKey:
type: string
description: Temporary access key to sign requests
secretKey:
type: string
description: Temporary secret access key to sign requests
sessionToken:
type: string
description: Tempoarary session token
expiration:
type: integer
description: |
Expiration date of the temporary credentials in millis since 1/1/1970
LoginUserResponse:
properties:
identityId:
type: string
description: The unique identifier for the new user
token:
type: string
description: An OpenID token for the new user
credentials:
type: object
properties:
accessKey:
type: string
description: Temporary access key to sign requests
secretKey:
type: string
description: Temporary secret access key to sign requests
sessionToken:
type: string
description: Tempoarary session token
expiration:
type: integer
description: |
Expiration date of the temporary credentials in millis since 1/1/1970
NewPet:
properties:
petType:
type: string
description: Free text pet type
petName:
type: string
description: Free text pet name
petAge:
type: integer
description: Age of the new pet
NewPetResponse:
properties:
petId:
type: string
description: The generated unique identifier for the new pet
Pet:
properties:
petId:
type: string
description: The generated unique identifier for the new pet
petType:
type: string
description: Free text pet type
petName:
type: string
description: Free text pet name
petAge:
type: integer
description: Age of the new pet
Pets:
type: array
items:
$ref: Pet
Error:
properties:
code:
type: integer
format: int32
message:
type: string
fields:
type: string
內容很長,不要害怕,分解開來就簡單了。把復雜的事情分解一下就變簡單了。
設置觸發(fā)的lambda 函數(shù)
x-amazon-apigateway-integration:
type: "aws_proxy"
httpMethod: "POST"
uri: "arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:<accountId>:function:<function-name>/invocations"
credentials: "arn:aws:iam::<accountId>:role/<role-name>"
- x-amazon-apigateway-integration 代表集成apigateway
- type 代表使用了lambda代理
- httpMethod 必須是POST
- uri就是lambda的路徑
- credentials: 這個是證書的意思,比較復雜。不寫也可以集成,但是你會發(fā)現(xiàn)無法讓API gateway 觸發(fā)lamnda,會報permission之類的錯誤
設置 credentials
- 首先要創(chuàng)建一個角色
- 要給這個角色賦予AWSLambdaFullAccess的policy權限
- 要讓這個角色相信api gateway(role>>Trust relationships>>edit>>save)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [
"lambda.amazonaws.com",
"apigateway.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}
- 要讓設置在swagger中的用戶擁有passRole的權限
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PolicyStatementToAllowUserToPassOneSpecificRole",
"Effect": "Allow",
"Action": "iam:PassRole",
"Resource": "arn:aws:iam::<accountId>:role/swagger-role"
}
]
}
- 把這個policy添加給用戶。這樣設置給swagger的aws用戶就擁有PassRole的權限了,這樣寫到credentials的role-那么就能發(fā)揮作用了。
設置api gateway的 authorise 驗證,
securityDefinitions:
cognito_auth:
type: "apiKey"
name: "accessToken"
in: "header"
x-amazon-apigateway-authtype: "cognito_user_pools"
x-amazon-apigateway-authorizer:
type: "cognito_user_pools"
providerARNs: ["arn:aws:cognito-idp:us-west-2:<accountId>:userpool/<userpoolId>"]
request_lambda_auth:
type: "apiKey"
name: "Unused"
in: "header"
x-amazon-apigateway-authtype: "custom"
x-amazon-apigateway-authorizer:
type: "request"
identitySource : "method.request.header.access_key, method.request.header.access_type"
authorizerUri: "arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:<accountId>:function:<lambda name>/invocations"
authorizerResultTtlInSeconds : 300
- 這樣 寫好后,你就可以將cognito_auth 或者request_lambda_auth 放置到每個API的security下了
設置 api gateway的錯誤返回模版
x-amazon-apigateway-gateway-responses:
BAD_REQUEST_PARAMETERS:
statusCode: 400
responseTemplates:
application/json: "{\"error\":{\"code\":400,\"name\":\"ParameterIncorrectException\",\"message\": $context.error.messageString} }"