Cloudformation не может создать политику ресурсов для apigateway

Политика ресурсов работает нормально, когда я напрямую передаю ее на консоль. Ниже приведен пример политики ресурсов:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:us-west-2:339159142535:ooxmwl6q4e/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        ""14.98.8.190/32""
                    ]
                }
            }
        }
    ]
}

Теперь, как создать шаблон cloudformation для создания и подключения к apigateway.

Я попытался создать политику, но в соответствии с новой политикой «Основной» устарел.

Я тоже создал роль, но не помогло. Ниже приведен фрагмент роли: -

{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Resources": {
        "Apifirewall": {
            "Type": "AWS::IAM::Role",
            "Properties": {
                "AssumeRolePolicyDocument": {
                    "Version": "2012-10-17",
                    "Statement": [
                        {
                            "Effect": "Allow",
                            "Principal": {
                                "Service": [
                                    "apigateway.amazonaws.com"
                                ]
                            },
                            "Action": [
                                "sts:AssumeRole"
                            ]
                        }
                    ]
                },
                "Policies": [
                    {
                        "PolicyName": "Apifirewall",
                        "PolicyDocument": {
                            "Version": "2012-10-17",
                            "Statement": [
                                {
                                    "Effect": "Allow",
                                    "Action": "*",
                                    "Resource": [
                                        "arn:aws:execute-api:us-west-2:339159142535:ooxmwl6q4e/*"
                                    ],
                                    "Condition": {
                                        "IpAddress": {
                                            "aws:SourceIp": [
                                                "14.98.8.190/32"
                                            ]
                                        }
                                    }
                                }
                            ]
                        }
                    }
                ]
            }
        }
    },
    "Outputs": {
        "Apifirewall": {
            "Value": {
                "Fn::GetAtt": [
                    "Apifirewall",
                    "Arn"
                ]
            }
        }
    }
}

пожалуйста, не делайте опечатку в политике ресурсов на разрешенном ip

Abhishek kumar 10.04.2019 15:35
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
1
6 615
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Политика ресурсов APIGateway не привязана к политике IAM, это ресурс другого типа.

Поэтому, чтобы реализовать его в своем RestApi, вы должны использовать параметр Политика для ресурса AWS::ApiGateway::RestApi на

{
  "Type" : "AWS::ApiGateway::RestApi",
  "Properties" : {  
    "ApiKeySourceType" : String,
    "BinaryMediaTypes" : [ String, ... ],
    "Body" : JSON object,
    "BodyS3Location" : S3Location,
    "CloneFrom" : String,
    "Description" : String,      
    "EndpointConfiguration" : EndpointConfiguration,
    "FailOnWarnings" : Boolean,
    "MinimumCompressionSize" : Integer,
    "Name" : String,
    "Parameters" : { String:String, ... },
    "Policy" : JSON object
  }
}

Есть ли способ упомянуть группу безопасности в состоянии политики??

Abhishek kumar 15.04.2019 17:18

К сведению: Policy — это PolicyDocument, поэтому не включайте ключи PolicyName или PolicyDocument. Кроме того, если вы используете YAML, Policy по-прежнему JSON.

Luke Willis 13.02.2020 17:02

Ниже приведен весь CFT для развертывания API с интеграцией лямбда.

{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Parameters": {
        "AppEnv": {
            "Type": "String",
            "Description": "Application environment, for this deployment"
        },
        "DeployTag": {
            "Type": "String",
            "Description": "Distinct deployment tag ex: BLUE, GREEN"
        }
    },
    "Resources": {
        "LambdaExecutionRole": {
            "Type": "AWS::IAM::Role",
            "Properties": {
                "AssumeRolePolicyDocument": {
                    "Version": "2012-10-17",
                    "Statement": [
                        {
                            "Effect": "Allow",
                            "Principal": {
                                "Service": [
                                    "lambda.amazonaws.com"
                                ]
                            },
                            "Action": [
                                "sts:AssumeRole"
                            ]
                        }
                    ]
                },
                "ManagedPolicyArns": [
                    "arn:aws:iam::aws:policy/AWSLambdaFullAccess"
                ]
            }
        },
        "RecommenderLambda": {
            "Type": "AWS::Lambda::Function",
            "Properties": {
                "Handler": "recommender_field_validation_lambda.lambda_handler",
                "FunctionName": "recommenderlambda2",
                "Role": {
                    "Fn::GetAtt": [
                        "LambdaExecutionRole",
                        "Arn"
                    ]
                },
                "Environment": {
                    "Variables": {
                        "S3_BUCKET": "belcorp.recommender.test",
                        "REGION_NAME": "us-west-2",
                        "TOPIC_ARN": {
                            "Fn::ImportValue": "RecommenderTopicARN"
                        },
                        "TABLE_NAME": {
                            "Fn::ImportValue": "recommederrequestinfo"
                        }
                    }
                },
                "Code": {
                    "S3Bucket": "belcorp.recommender.lambdas",
                    "S3Key": "recommender_field_validation_lambda.zip"
                },
                "Runtime": "python3.6",
                "Timeout": 25
            }
        },
        "LambdaPermission": {
            "DependsOn": "RecommenderLambda",
            "Type": "AWS::Lambda::Permission",
            "Properties": {
                "Action": "lambda:invokeFunction",
                "FunctionName": "recommenderlambda2",
                "Principal": "apigateway.amazonaws.com",
                "SourceArn": {
                    "Fn::Join": [
                        "",
                        [
                            "arn:aws:execute-api:",
                            {
                                "Ref": "AWS::Region"
                            },
                            ":",
                            {
                                "Ref": "AWS::AccountId"
                            },
                            ":",
                            {
                                "Ref": "RecommenderApi"
                            },
                            "/*"
                        ]
                    ]
                }
            }
        },
        "RecommenderApi": {
            "Type": "AWS::ApiGateway::RestApi",
            "Properties": {
                "EndpointConfiguration": {
                    "Types": [
                        "EDGE"
                    ]
                },
                "Description": "RecommenderAPI",
                "Name": {
                    "Fn::Sub": "RecommenderApi-${AppEnv}-${DeployTag}"
                },
                "Policy": {
                    "Version": "2012-10-17",
                    "Statement": [
                        {
                            "Effect": "Allow",
                            "Principal": "*",
                            "Action": "execute-api:Invoke",
                            "Resource": {
                                "Fn::Sub": "arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:*/*"
                            },
                            "Condition": {
                                "IpAddress": {
                                    "aws:SourceIp": [
                                        "14.98.8.190/32"
                                    ]
                                }
                            }
                        }
                    ]
                }
            }
        },
        "ApiGatewayAccount": {
            "Type": "AWS::ApiGateway::Account",
            "Properties": {
                "CloudWatchRoleArn": {
                    "Fn::ImportValue": "cloudwatchRole"
                }
            }
        },
        "ApiDeployment": {
            "Type": "AWS::ApiGateway::Deployment",
            "DependsOn": [
                "OfferPostMethod",
                "OrderPostMethod"
            ],
            "Properties": {
                "RestApiId": {
                    "Ref": "RecommenderApi"
                },
                "StageName": "dev"
            }
        },
        "ProcessInput": {
            "Type": "AWS::ApiGateway::Resource",
            "Properties": {
                "RestApiId": {
                    "Ref": "RecommenderApi"
                },
                "ParentId": {
                    "Fn::GetAtt": [
                        "RecommenderApi",
                        "RootResourceId"
                    ]
                },
                "PathPart": "process-input"
            }
        },
        "OfferLevel": {
            "Type": "AWS::ApiGateway::Resource",
            "Properties": {
                "RestApiId": {
                    "Ref": "RecommenderApi"
                },
                "ParentId": {
                    "Ref": "ProcessInput"
                },
                "PathPart": "offer-level"
            }
        },
        "OrderLevel": {
            "Type": "AWS::ApiGateway::Resource",
            "Properties": {
                "RestApiId": {
                    "Ref": "RecommenderApi"
                },
                "ParentId": {
                    "Ref": "ProcessInput"
                },
                "PathPart": "order-level"
            }
        },
        "OfferPostMethod": {
            "DependsOn": "RecommenderLambda",
            "Type": "AWS::ApiGateway::Method",
            "Properties": {
                "RestApiId": {
                    "Ref": "RecommenderApi"
                },
                "ResourceId": {
                    "Ref": "OfferLevel"
                },
                "HttpMethod": "POST",
                "AuthorizationType": "NONE",
                "Integration": {
                    "Type": "AWS_PROXY",
                    "IntegrationHttpMethod": "POST",
                    "Uri": {
                        "Fn::Join": [
                            "",
                            [
                                "arn:aws:apigateway:",
                                {
                                    "Ref": "AWS::Region"
                                },
                                ":lambda:path/2015-03-31/functions/",
                                {
                                    "Fn::GetAtt": [
                                        "RecommenderLambda",
                                        "Arn"
                                    ]
                                },
                                "/invocations"
                            ]
                        ]
                    },
                    "IntegrationResponses": [
                        {
                            "StatusCode": 200,
                            "ResponseTemplates": {
                                "application/json": "$input.json('$.body')"
                            }
                        }
                    ]
                }
            }
        },
        "OrderPostMethod": {
            "DependsOn": "RecommenderLambda",
            "Type": "AWS::ApiGateway::Method",
            "Properties": {
                "RestApiId": {
                    "Ref": "RecommenderApi"
                },
                "ResourceId": {
                    "Ref": "OrderLevel"
                },
                "HttpMethod": "POST",
                "AuthorizationType": "NONE",
                "Integration": {
                    "Type": "AWS_PROXY",
                    "IntegrationHttpMethod": "POST",
                    "Uri": {
                        "Fn::Join": [
                            "",
                            [
                                "arn:aws:apigateway:",
                                {
                                    "Ref": "AWS::Region"
                                },
                                ":lambda:path/2015-03-31/functions/",
                                {
                                    "Fn::GetAtt": [
                                        "RecommenderLambda",
                                        "Arn"
                                    ]
                                },
                                "/invocations"
                            ]
                        ]
                    },
                    "IntegrationResponses": [
                        {
                            "StatusCode": 200,
                            "ResponseTemplates": {
                                "application/json": "$input.json('$.body')"
                            }
                        }
                    ]
                }
            }
        }
    },
    "Outputs": {
        "RootUrl": {
            "Description": "Root URL of the API gateway",
            "Value": {
                "Fn::Join": [
                    "",
                    [
                        "https://",
                        {
                            "Ref": "RecommenderApi"
                        },
                        ".execute-api.",
                        {
                            "Ref": "AWS::Region"
                        },
                        ".amazonaws.com"
                    ]
                ]
            }
        },
        "OfferUrl": {
            "Description": "Root URL of the API gateway",
            "Value": {
                "Fn::Join": [
                    "",
                    [
                        "https://",
                        {
                            "Ref": "RecommenderApi"
                        },
                        ".execute-api.",
                        {
                            "Ref": "AWS::Region"
                        },
                        ".amazonaws.com",
                        "/dev/process-input/offer-level"
                    ]
                ]
            }
        },
        "OrderUrl": {
            "Description": "Root URL of the API gateway",
            "Value": {
                "Fn::Join": [
                    "",
                    [
                        "https://",
                        {
                            "Ref": "RecommenderApi"
                        },
                        ".execute-api.",
                        {
                            "Ref": "AWS::Region"
                        },
                        ".amazonaws.com",
                        "/dev/process-input/order-level"
                    ]
                ]
            }
        }
    }
}

Всегда приятно иметь пример. Спасибо за публикацию. Если вы хотите, чтобы это был документ YAML, вы можете загрузить его с помощью CloudFormation Designer через консоль AWS, а затем просто переключить YAML.

Michael Behrens 05.02.2020 00:00

Если вы используете YAML для CloudFormation, Policy может быть в YAML. Для этого нет необходимости использовать JSON. Например:

  Parameters:
    ApiAllowedIps:
      Type: CommaDelimitedList

  RestApi:
    Type: AWS::ApiGateway::RestApi
    Properties:
      ...
      Policy: 
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Action: '*'
            Principal: '*'
            Resource: '*'
            Condition:
              IpAddress:
                aws:SourceIp: !Ref ApiAllowedIps  

Другие вопросы по теме