UNPKG

@sls-next/aws-sqs

Version:

Deploy SQS queues to AWS in seconds with [Serverless Components](https://github.com/serverless/components).

177 lines (146 loc) 3.9 kB
const aws = require("aws-sdk"); const { isEmpty, mergeDeepRight, pick } = require("ramda"); const { Component } = require("@serverless/core"); const { createQueue, deleteQueue, getDefaults, getQueue, getAccountId, getArn, getUrl, setAttributes, configureTags } = require("./utils"); const outputsList = ["arn", "url"]; const defaults = { name: "serverless", region: "us-east-1", tags: undefined }; class AwsSqsQueue extends Component { async default( inputs = { name: undefined, region: undefined, arn: undefined, url: undefined, tags: undefined } ) { const config = mergeDeepRight(getDefaults({ defaults }), inputs); const accountId = await getAccountId(aws); if (aws && aws.config) { aws.config.update({ maxRetries: parseInt(process.env.SLS_NEXT_MAX_RETRIES || "10"), retryDelayOptions: { base: 200 } }); } const arn = getArn({ aws, accountId, name: config.name, region: config.region }); const queueUrl = getUrl({ aws, accountId, name: config.name, region: config.region }); config.arn = arn; config.url = queueUrl; this.context.status(`Deploying`); const sqs = new aws.SQS({ region: config.region, credentials: this.context.credentials.aws }); const prevInstance = await getQueue({ sqs, queueUrl: this.state.url || queueUrl }); if (isEmpty(prevInstance)) { this.context.status(`Creating`); await createQueue({ sqs, config: config }); } else { if (this.state.url === queueUrl) { this.context.status(`Updating`); await setAttributes(sqs, queueUrl, config); } else { if (this.state.url) { this.context.debug(`The QueueUrl has changed`); this.context.debug(`Deleting previous queue`); await deleteQueue({ sqs, queueUrl: this.state.url }); } this.context.debug(`Creating new queue`); await createQueue({ sqs, config: config }); } } // Synchronize tags if specified if (config.tags) { this.context.debug( "Configuring SQS queue tags since they are specified." ); await configureTags(this.context, sqs, queueUrl, config.tags); } this.state.name = config.name; this.state.arn = config.arn; this.state.url = config.url; this.state.region = config.region; this.state.tags = config.tags; await this.save(); const outputs = pick(outputsList, config); return outputs; } async addEventSource(functionArn) { const lambda = new aws.Lambda({ region: this.state.region, credentials: this.context.credentials.aws }); const existing = await lambda .listEventSourceMappings({ EventSourceArn: this.state.arn, FunctionName: functionArn }) .promise(); const mappings = existing.EventSourceMappings || []; if (mappings.length) { return; } await lambda .createEventSourceMapping({ EventSourceArn: this.state.arn, FunctionName: functionArn }) .promise(); } async remove(inputs = {}) { const config = mergeDeepRight(defaults, inputs); config.name = inputs.name || this.state.name || defaults.name; const sqs = new aws.SQS({ region: config.region, credentials: this.context.credentials.aws }); const accountId = await getAccountId(aws); const queueUrl = this.state.url || getUrl({ aws, accountId, name: config.name, region: config.region }); this.context.status(`Removing`); await deleteQueue({ sqs, queueUrl }); this.state = {}; await this.save(); return {}; } } module.exports = AwsSqsQueue;