[英]How to construct AWS CloudFormation integration URI for AWS ApiGateway integration with S3, SQS, SNS, DynamoDB and other services?
當使用另一個 AWS 服務操作設置集成請求時,集成請求 URI 也是一個 ARN。
例如,對於與 Amazon S3 的 GetBucket 操作的集成,集成請求 URI 是以下格式的 ARN:
arn:aws:apigateway:api-region:s3:路徑
查看更多: https://docs.aws.amazon.com/apigateway/latest/developerguide/integration-request-basic-setup.html
Dynamodb:比 S3 復雜一點: https://aws.amazon.com/blogs/compute/using-amazon-api-gateway-as-a-proxy-for-dynamodb/
SNS: https://aws.amazon.com/premiumsupport/knowledge-center/api-gateway-proxy-integrate-service/
對於 SQS,我找到了 cloudformation 設置:
PostMethod:
Type: "AWS::ApiGateway::Method"
Properties:
AuthorizationType: "NONE"
ApiKeyRequired: "true"
HttpMethod: "POST"
ResourceId: !Ref "SomeResource"
RestApiId: !Ref "RestApi"
MethodResponses:
- StatusCode: 200
Integration:
Credentials: !GetAtt "RestApiRole.Arn"
IntegrationHttpMethod: "POST"
IntegrationResponses:
- StatusCode: 200
Type: "AWS"
Uri: !Sub "arn:aws:apigateway:${AWS::Region}:sqs:action/SendMessage"
RequestParameters:
integration.request.querystring.QueueUrl: !Sub "'${SomeQueue}'"
integration.request.querystring.MessageBody: "method.request.body"
這里是 RestApiRole 的代碼:
RestApiRole:
Type: "AWS::IAM::Role"
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Action:
- "sts:AssumeRole"
Principal:
Service:
- "apigateway.amazonaws.com"
Effect: "Allow"
Policies:
- PolicyName: "InvokeLambda"
PolicyDocument:
Version: "2012-10-17"
Statement:
- Action:
- "lambda:InvokeFunction"
Resource: !GetAtt "LambdaFunction.Arn"
Effect: "Allow"
來自 Uri 屬性文檔:
如果您為 Type 屬性指定 AWS,請指定遵循以下形式的 AWS 服務:arn:aws:apigateway:region:subdomain.service|service:path|action/service_api。 例如,Lambda function URI 遵循以下形式:arn:aws:apigateway:region:lambda:path/path。 該路徑通常采用 /2015-03-31/functions/LambdaFunctionARN/invocations 的形式。 有關更多信息,請參閱 Amazon API 網關 REST API 參考中集成資源的 uri 屬性。
來自另一個 AWS 文檔的更多描述和示例:
從這些文檔示例和描述中,似乎有 2 種類型的 API——基於操作和基於路徑。
使用基於動作的 API
我認為大多數人(如果不是全部)都支持這一點。 雖然這些操作在 IAM 設置和所有 API 文檔中可用,但所有 AWS 服務都是web服務,也就是它們具有 API 接口,並且這些接口使用操作。 如果某些服務有誤,請糾正我,但我認為通過遵循此結構應該可以對與 API 網關服務集成的任何服務進行任何調用。
有時需要使用路徑 API
試圖使用 PutObject 將文件上傳到 S3,但出現錯誤:
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>MethodNotAllowed</Code>
<Message>The specified method is not allowed against this resource.</Message>
<Method>PUT</Method>
<ResourceType>SERVICE</ResourceType>
<RequestId>....</RequestId>
<HostId>....=</HostId>
</Error>
替換為路徑 API 格式,它成功了。 所以這里的學習是我將繼續首先嘗試使用操作 API,如果不能針對該特定操作 - 切換到路徑 API,而我覺得操作 API 更具聲明性。
示例結構操作 API:
arn:aws:apigateway:us-east-1:SERVICE_NAME:action/ACTION_NAME&Var1=Value1&Var2=Value2
對 S3 服務的示例調用。 操作名稱 - GetObject 。 此 API 操作的文檔說有 2 個必需屬性 - Bucket(存儲桶名稱)和 Key。 如此完整的示例 URI:
arn:aws:apigateway:us-east-1:s3:action/GetObject&Bucket=myDemoBucket1&Key=some/path/to/file
與路徑 API 相同:
arn:aws:apigateway:us-east-1:s3:path/myDemoBucket1/some/path/to/file
我找到了一種獲取樣本的方法。 使用控制台 UI,制作端點,部署到某個階段和 go 到階段,select 導出選項卡,並導出為 Yaml 格式的 Swagger + API 網關擴展。 當我將 Yaml 與 cloudformation 一起使用時。 在那個 Yaml 里面有你需要的一切。 如果沒有“Stages”,go 到“Resources”,然后從下拉列表 select 在對話框中部署和創建 Stage。
以下是我能夠為主要服務找到的一些不同示例:
調用 Lambda 文檔:
arn:aws:apigateway:api-region:lambda:path//2015-03-31/functions/ arn:aws:lambda:lambda-region:account-id:function:lambda-function-name /invocations
路徑部分似乎是API 文檔中的 map 到 API 操作:
DynamoDB 博客文章
您需要使用 API Action 文檔 + Api Action名稱 + IntegrationRequest 模板的 HTTP 方法來調用 DynamoDB。
查詢操作的示例 URI:
arn:aws:apigateway:us-east-1:dynamodb:action/Query
社交網絡博客文章
示例 URI: arn:aws:apigateway:region:sns:action/Publish
With region: arn:aws:apigateway:us-east-1:sns:action/Publish
需要通過URL Query String參數傳入TopicArn和Message等參數。 關於這個主題有很好的話題: https://stackoverflow.com/a/64268791/1737158
https://docs.aws.amazon.com/sns/latest/api/API_Publish.html#API_Publish_Examples
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.