#amazon-web-services #amazon-cloudformation #aws-codepipeline
#amazon-web-services #aws-cloudformation #aws-codepipeline
Вопрос:
У меня был кодовый конвейер с шаблоном cloudformation. Я создаю AWS :: APIGateway ::Resource и AWS :: APIGateway ::Method для доступа к корзине S3. В первый раз он создает метод с помощью API. Но когда я вношу изменения в репозиторий и он выполняет повторное развертывание, метод удаляется.
Я не могу, в чем причина. У кого-нибудь есть какие-то подсказки! Спасибо!
QrResource:
Type: "AWS::ApiGateway::Resource"
Properties:
ParentId:
Fn::GetAtt:
- "myApi"
- "RootResourceId"
RestApiId: !Ref myApi
PathPart: "qr"
QrItemResource:
Type: "AWS::ApiGateway::Resource"
Properties:
ParentId: !Ref QrResource
RestApiId: !Ref myApi
PathPart: "{item}"
Qr:
Type: "AWS::ApiGateway::Method"
Properties:
HttpMethod: GET
ApiKeyRequired: false
AuthorizationType: NONE
RequestParameters:
method.request.header.Content-Disposition: false
method.request.header.Content-Type: false
method.request.header.Accept: false
method.request.path.item: true
MethodResponses:
- StatusCode: 200
ResponseParameters:
method.response.header.Content-Type: integration.response.header.Content-Type
method.response.header.Content-Disposition: integration.response.header.Content-Disposition
method.response.header.Accept-Ranges: integration.response.header.Accept-Ranges
ResponseModels:
"application/json": EmptyModel
- StatusCode: 403
ResponseModels:
"application/json": ErrorModel
RestApiId: !Ref myApi
ResourceId: !Ref QrItemResource
Integration:
Type: AWS
Credentials: !Ref RoleApi
IntegrationHttpMethod: GET
PassthroughBehavior: WHEN_NO_MATCH
IntegrationResponses:
- StatusCode: 200
SelectionPattern: 200
ContentHandling: CONVERT_TO_BINARY
ResponseParameters:
method.response.header.Content-Type: integration.response.header.Content-Type
method.response.header.Accept-Ranges: "'bytes'"
method.response.header.Content-Disposition: "'inline'"
ResponseTemplates:
"application/json": ""
RequestParameters:
integration.request.header.Content-Disposition: method.request.header.Content-Disposition
integration.request.header.Content-Type: method.request.header.Content-Type
integration.request.header.Accept: method.request.header.Accept
integration.request.path.item: method.request.path.item
Uri: arn:aws:apigateway:us-east-1:s3:path/s3-bucket/{item}
Комментарии:
1. Отступ файла YAML выглядит неверно. Согласно приведенному здесь YAML, QrItemResource и Qr вложены в QrResource . Таков ваш исходный файл YAML?
2. в исходном yaml отступ правильный. QrItemResource — это вложенный QrResource, а Qr — это метод доступа к S3. Я хочу, чтобы конечной точкой был /qr/{item}
3. Можете ли вы проверить в консоли CFN, какие сообщения? Какие-либо ошибки? Что именно заменяется? Некоторые обновления потребуют замены исходного ресурса.
4. Я проверил консоль, ошибок нет. Впервые /qr/{item} был создан как конечная точка. Он добавил как ресурс, так и метод. Во второй раз я добавил новую лямбда-функцию. Он создал новую конечную точку для лямбда-функции с удаленным /qr/{item} . Но в журнале указано: для ресурса «замена»: «Условный», для меня «замена»: «Ложь».
Ответ №1:
У меня была такая же проблема, поэтому я открыл заявку в службе поддержки AWS. Это был их ответ:
Customer is using Serverless Application Model(SAM) (AWS::Serverless::Api AWS::Serverless::Function) resources along with API Gateway CFN Resources (AWS::ApiGateway::Method) to define their API.
This can have unpredictable situation where first can overwrite the second. We highly recommend customer to define this new resources in SAM directly under AWS::Serverless::Api as part of OpenApi.
Во-первых, я посчитал это ошибкой, поскольку having unpredictable situations where first can overwrite the second
ни для кого не похоже на желаемое поведение.
Но позже они объяснили мне, что AWS::Serverless::Api
создает все необходимые ресурсы (например AWS::APIGateway::RestApi
) для подключения всего.
Итак, если вы вносите изменения, при которых изменяются все ресурсы ( AWS::Serverless::Api
, AWS::ApiGateway::Resource
и AWS::ApiGateway::Method
), Cloudformation применит эти изменения в определении OpenAPI, и все будет работать так, как ожидалось.
С другой стороны, если вы вносите изменения в AWS::Serverless::Api
(например, добавляете AWS::Serverless::Function
прикрепленный к AWS::Serverless::Api
), Cloudformation не обнаружит изменений в AWS::ApiGateway::Resource
и AWS::ApiGateway::Method
(поэтому определение AWS::Serverless::Api
OpenAPI перезапишет ваши автономные методы и путь).
Похоже, у них нет возможности проверить эти конфликты на своей стороне, что имеет немного больше смысла.
Итак, в конце концов, решение состоит в том, чтобы не смешивать AWS::Serverless::Api
с автономными AWS::ApiGateway
ресурсами (например AWS::ApiGateway::Method
, и AWS::ApiGateway::Resource
).
Фактически, они сказали мне, что собираются обновить свою документацию, чтобы добавить эту рекомендацию. (похоже, что он еще не был запущен, но мы можем найти историю документации здесь)