UNPKG

serverless

Version:

Serverless Framework - Build web, mobile and IoT applications with serverless architectures using AWS Lambda, Azure Functions, Google CloudFunctions & more

80 lines (73 loc) 2.63 kB
'use strict'; const _ = require('lodash'); const ServerlessError = require('../../../../../../../serverless-error'); function createUsagePlanKeyResource(that, usagePlanLogicalId, keyNumber, keyName) { const apiKeyLogicalId = that.provider.naming.getApiKeyLogicalId(keyNumber, keyName); const resourceTemplate = { Type: 'AWS::ApiGateway::UsagePlanKey', Properties: { KeyId: { Ref: apiKeyLogicalId, }, KeyType: 'API_KEY', UsagePlanId: { Ref: usagePlanLogicalId, }, }, }; return _.cloneDeep(resourceTemplate); } module.exports = { compileUsagePlanKeys() { const apiKeys = _.get(this.serverless.service.provider.apiGateway, 'apiKeys'); if (apiKeys) { const resources = this.serverless.service.provider.compiledCloudFormationTemplate.Resources; let keyNumber = 0; apiKeys.forEach((apiKeyDefinition) => { // if multiple API key types are used const apiKey = Object.entries(apiKeyDefinition)[0]; const name = apiKey[0]; const value = _.last(apiKey); const usagePlansIncludeName = this.apiGatewayUsagePlanNames.includes(name); if ( this.apiGatewayUsagePlanNames.length > 0 && !usagePlansIncludeName && _.isObject(value) ) { throw new ServerlessError( `API key "${name}" has no usage plan defined`, 'API_GATEWAY_KEY_WITHOUT_USAGE_PLAN' ); } if (_.isObject(apiKeyDefinition) && usagePlansIncludeName) { keyNumber = 0; apiKeyDefinition[name].forEach(() => { keyNumber += 1; const usagePlanKeyLogicalId = this.provider.naming.getUsagePlanKeyLogicalId( keyNumber, name ); const usagePlanLogicalId = this.provider.naming.getUsagePlanLogicalId(name); const resourceTemplate = createUsagePlanKeyResource( this, usagePlanLogicalId, keyNumber, name ); _.merge(resources, { [usagePlanKeyLogicalId]: resourceTemplate, }); }); } else { keyNumber += 1; const usagePlanKeyLogicalId = this.provider.naming.getUsagePlanKeyLogicalId(keyNumber); const usagePlanLogicalId = this.provider.naming.getUsagePlanLogicalId(); const resourceTemplate = createUsagePlanKeyResource(this, usagePlanLogicalId, keyNumber); _.merge(resources, { [usagePlanKeyLogicalId]: resourceTemplate, }); } }); } }, };