in syndicate/core/resources/api_gateway_resource.py [0:0]
def _create_api_gateway_from_meta(self, name, meta):
""" Create API Gateway with all specified meta.
:type name: str
:type meta: dict
"""
validate_params(name, meta, API_REQUIRED_PARAMS)
api_resources = meta['resources']
# whether to put a wildcard in lambda resource-based policy permissions
resources_permission_singleton = meta.get(POLICY_STATEMENT_SINGLETON)
api_gw_describe = self.describe_api_resources(name, meta)
if api_gw_describe:
_LOG.info(f'Api gateway with name \'{name}\' exists. Returning')
return api_gw_describe
_LOG.info(f'Api gateway with name \'{name}\' does not exist. Creating')
api_item = self.connection.create_rest_api(
api_name=name,
binary_media_types=meta.get('binary_media_types'),
tags=meta.get('tags'))
api_id = api_item['id']
# create default request validators
self._create_default_validators(api_id)
# set minimumCompressionSize if the param exists
minimum_compression_size = meta.get('minimum_compression_size', None)
if not minimum_compression_size:
_LOG.debug("No minimal_compression_size param - "
"compression isn't enabled")
self.connection.update_compression_size(
rest_api_id=api_id,
compression_size=minimum_compression_size)
# deploy authorizers
authorizers = meta.get('authorizers', {})
for key, val in authorizers.items():
uri = None
provider_arns = []
if val.get('type') == _COGNITO_AUTHORIZER_TYPE:
for pool in val.get('user_pools'):
user_pool_id = self.cognito_res.get_user_pool_id(pool)
provider_arns.append(
f'arn:aws:cognito-idp:{self.region}:{self.account_id}:'
f'userpool/{user_pool_id}')
else:
lambda_version = val.get('lambda_version')
lambda_name = val.get('lambda_name')
lambda_alias = val.get('lambda_alias')
lambda_arn = self.lambda_res. \
resolve_lambda_arn_by_version_and_alias(lambda_name,
lambda_version,
lambda_alias)
uri = f'arn:aws:apigateway:{self.region}:lambda:path/' \
f'2015-03-31/functions/{lambda_arn}/invocations'
api_source_arn = (f'arn:aws:execute-api:{self.region}:'
f'{self.account_id}:{api_id}/*/*')
self.lambda_res.add_invocation_permission(
statement_id=api_id,
name=lambda_arn,
source_arn=api_source_arn,
principal='apigateway.amazonaws.com')
self.connection.create_authorizer(api_id=api_id, name=key,
type=val['type'],
authorizer_uri=uri,
identity_source=val.get(
'identity_source'),
ttl=val.get('ttl'),
provider_arns=provider_arns)
models = meta.get('models')
if models:
args = [{'api_id': api_id, 'models': {k: v}} for k, v in
models.items()]
self.create_pool(self._create_model_from_metadata, args, 1)
if api_resources:
api_resp = meta.get('api_method_responses')
api_integration_resp = meta.get('api_method_integration_responses')
args = self.__prepare_api_resources_args(
api_id, api_resources, api_resp, api_integration_resp,
resources_permission_singleton)
self.create_pool(self._create_resource_from_metadata, args, 1)
else:
_LOG.info('There is no resources in %s API Gateway description.',
name)
# add headers
# waiter b4 customization
time.sleep(10)
_LOG.debug('Customizing API Gateway responses...')
# _customize_gateway_responses call is commented due to botocore
# InternalFailure while performing the call. will be fixed later
# _customize_gateway_responses(api_id)
# deploy api
self.__deploy_api_gateway(api_id, meta, api_resources)
return self.describe_api_resources(api_id=api_id, meta=meta, name=name)