UNPKG

@aws-cdk/aws-ec2

Version:

The CDK Construct Library for AWS::EC2

875 lines 91.1 kB
"use strict"; var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k; Object.defineProperty(exports, "__esModule", { value: true }); exports.InitSource = exports.InitService = exports.InitPackage = exports.InitUser = exports.InitGroup = exports.InitFile = exports.InitCommand = exports.InitCommandWaitDuration = exports.InitElement = exports.InitServiceRestartHandle = void 0; const jsiiDeprecationWarnings = require("../.warnings.jsii.js"); const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const fs = require("fs"); const s3_assets = require("@aws-cdk/aws-s3-assets"); const core_1 = require("@aws-cdk/core"); const cfn_init_internal_1 = require("./private/cfn-init-internal"); /** * An object that represents reasons to restart an InitService * * Pass an instance of this object to the `InitFile`, `InitCommand`, * `InitSource` and `InitPackage` objects, and finally to an `InitService` * itself to cause the actions (files, commands, sources, and packages) * to trigger a restart of the service. * * For example, the following will run a custom command to install Nginx, * and trigger the nginx service to be restarted after the command has run. * * ```ts * const handle = new ec2.InitServiceRestartHandle(); * ec2.CloudFormationInit.fromElements( * ec2.InitCommand.shellCommand('/usr/bin/custom-nginx-install.sh', { serviceRestartHandles: [handle] }), * ec2.InitService.enable('nginx', { serviceRestartHandle: handle }), * ); * ``` */ class InitServiceRestartHandle { constructor() { this.commands = new Array(); this.files = new Array(); this.sources = new Array(); this.packages = {}; } /** * Add a command key to the restart set * @internal */ _addCommand(key) { return this.commands.push(key); } /** * Add a file key to the restart set * @internal */ _addFile(key) { return this.files.push(key); } /** * Add a source key to the restart set * @internal */ _addSource(key) { return this.sources.push(key); } /** * Add a package key to the restart set * @internal */ _addPackage(packageType, key) { if (!this.packages[packageType]) { this.packages[packageType] = []; } this.packages[packageType].push(key); } /** * Render the restart handles for use in an InitService declaration * @internal */ _renderRestartHandles() { const nonEmpty = (x) => x.length > 0 ? x : undefined; return { commands: nonEmpty(this.commands), files: nonEmpty(this.files), packages: Object.keys(this.packages).length > 0 ? this.packages : undefined, sources: nonEmpty(this.sources), }; } } exports.InitServiceRestartHandle = InitServiceRestartHandle; _a = JSII_RTTI_SYMBOL_1; InitServiceRestartHandle[_a] = { fqn: "@aws-cdk/aws-ec2.InitServiceRestartHandle", version: "1.204.0" }; /** * Base class for all CloudFormation Init elements */ class InitElement { } exports.InitElement = InitElement; _b = JSII_RTTI_SYMBOL_1; InitElement[_b] = { fqn: "@aws-cdk/aws-ec2.InitElement", version: "1.204.0" }; /** * Represents a duration to wait after a command has finished, in case of a reboot (Windows only). */ class InitCommandWaitDuration { /** Wait for a specified duration after a command. */ static of(duration) { return new class extends InitCommandWaitDuration { /** @internal */ _render() { return duration.toSeconds(); } }(); } /** Do not wait for this command. */ static none() { return InitCommandWaitDuration.of(core_1.Duration.seconds(0)); } /** cfn-init will exit and resume only after a reboot. */ static forever() { return new class extends InitCommandWaitDuration { /** @internal */ _render() { return 'forever'; } }(); } } exports.InitCommandWaitDuration = InitCommandWaitDuration; _c = JSII_RTTI_SYMBOL_1; InitCommandWaitDuration[_c] = { fqn: "@aws-cdk/aws-ec2.InitCommandWaitDuration", version: "1.204.0" }; /** * Command to execute on the instance */ class InitCommand extends InitElement { constructor(command, options) { super(); this.command = command; this.options = options; this.elementType = cfn_init_internal_1.InitElementType.COMMAND.toString(); } /** * Run a shell command * * Remember that some characters like `&`, `|`, `;`, `>` etc. have special meaning in a shell and * need to be preceded by a `\` if you want to treat them as part of a filename. */ static shellCommand(shellCommand, options = {}) { try { jsiiDeprecationWarnings._aws_cdk_aws_ec2_InitCommandOptions(options); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, this.shellCommand); } throw error; } return new InitCommand(shellCommand, options); } /** * Run a command from an argv array * * You do not need to escape space characters or enclose command parameters in quotes. */ static argvCommand(argv, options = {}) { try { jsiiDeprecationWarnings._aws_cdk_aws_ec2_InitCommandOptions(options); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, this.argvCommand); } throw error; } if (argv.length === 0) { throw new Error('Cannot define argvCommand with an empty arguments'); } return new InitCommand(argv, options); } /** @internal */ _bind(options) { const commandKey = this.options.key || `${options.index}`.padStart(3, '0'); // 001, 005, etc. if (options.platform !== cfn_init_internal_1.InitPlatform.WINDOWS && this.options.waitAfterCompletion !== undefined) { throw new Error(`Command '${this.command}': 'waitAfterCompletion' is only valid for Windows systems.`); } for (const handle of this.options.serviceRestartHandles ?? []) { handle._addCommand(commandKey); } return { config: { [commandKey]: { command: this.command, env: this.options.env, cwd: this.options.cwd, test: this.options.testCmd, ignoreErrors: this.options.ignoreErrors, waitAfterCompletion: this.options.waitAfterCompletion?._render(), }, }, }; } } exports.InitCommand = InitCommand; _d = JSII_RTTI_SYMBOL_1; InitCommand[_d] = { fqn: "@aws-cdk/aws-ec2.InitCommand", version: "1.204.0" }; /** * Create files on the EC2 instance. */ class InitFile extends InitElement { constructor(fileName, options) { super(); this.fileName = fileName; this.options = options; this.elementType = cfn_init_internal_1.InitElementType.FILE.toString(); try { jsiiDeprecationWarnings._aws_cdk_aws_ec2_InitFileOptions(options); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, InitFile); } throw error; } } /** * Use a literal string as the file content */ static fromString(fileName, content, options = {}) { try { jsiiDeprecationWarnings._aws_cdk_aws_ec2_InitFileOptions(options); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, this.fromString); } throw error; } if (!content) { throw new Error(`InitFile ${fileName}: cannot create empty file. Please supply at least one character of content.`); } return new class extends InitFile { _doBind(bindOptions) { return { config: this._standardConfig(options, bindOptions.platform, { content, encoding: this.options.base64Encoded ? 'base64' : 'plain', }), }; } }(fileName, options); } /** * Write a symlink with the given symlink target */ static symlink(fileName, target, options = {}) { try { jsiiDeprecationWarnings._aws_cdk_aws_ec2_InitFileOptions(options); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, this.symlink); } throw error; } const { mode, ...otherOptions } = options; if (mode && mode.slice(0, 3) !== '120') { throw new Error('File mode for symlinks must begin with 120XXX'); } return InitFile.fromString(fileName, target, { mode: (mode || '120644'), ...otherOptions }); } /** * Use a JSON-compatible object as the file content, write it to a JSON file. * * May contain tokens. */ static fromObject(fileName, obj, options = {}) { try { jsiiDeprecationWarnings._aws_cdk_aws_ec2_InitFileOptions(options); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, this.fromObject); } throw error; } return new class extends InitFile { _doBind(bindOptions) { return { config: this._standardConfig(options, bindOptions.platform, { content: obj, }), }; } }(fileName, options); } /** * Read a file from disk and use its contents * * The file will be embedded in the template, so care should be taken to not * exceed the template size. * * If options.base64encoded is set to true, this will base64-encode the file's contents. */ static fromFileInline(targetFileName, sourceFileName, options = {}) { try { jsiiDeprecationWarnings._aws_cdk_aws_ec2_InitFileOptions(options); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, this.fromFileInline); } throw error; } const encoding = options.base64Encoded ? 'base64' : 'utf8'; const fileContents = fs.readFileSync(sourceFileName).toString(encoding); return InitFile.fromString(targetFileName, fileContents, options); } /** * Download from a URL at instance startup time */ static fromUrl(fileName, url, options = {}) { try { jsiiDeprecationWarnings._aws_cdk_aws_ec2_InitFileOptions(options); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, this.fromUrl); } throw error; } return new class extends InitFile { _doBind(bindOptions) { return { config: this._standardConfig(options, bindOptions.platform, { source: url, }), }; } }(fileName, options); } /** * Download a file from an S3 bucket at instance startup time */ static fromS3Object(fileName, bucket, key, options = {}) { try { jsiiDeprecationWarnings._aws_cdk_aws_ec2_InitFileOptions(options); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, this.fromS3Object); } throw error; } return new class extends InitFile { _doBind(bindOptions) { bucket.grantRead(bindOptions.instanceRole, key); return { config: this._standardConfig(options, bindOptions.platform, { source: bucket.urlForObject(key), }), authentication: standardS3Auth(bindOptions.instanceRole, bucket.bucketName), }; } }(fileName, options); } /** * Create an asset from the given file * * This is appropriate for files that are too large to embed into the template. */ static fromAsset(targetFileName, path, options = {}) { try { jsiiDeprecationWarnings._aws_cdk_aws_ec2_InitFileAssetOptions(options); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, this.fromAsset); } throw error; } return new class extends InitFile { _doBind(bindOptions) { const asset = new s3_assets.Asset(bindOptions.scope, `${targetFileName}Asset`, { path, ...options, }); asset.grantRead(bindOptions.instanceRole); return { config: this._standardConfig(options, bindOptions.platform, { source: asset.httpUrl, }), authentication: standardS3Auth(bindOptions.instanceRole, asset.s3BucketName), assetHash: asset.assetHash, }; } }(targetFileName, options); } /** * Use a file from an asset at instance startup time */ static fromExistingAsset(targetFileName, asset, options = {}) { try { jsiiDeprecationWarnings._aws_cdk_aws_ec2_InitFileOptions(options); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, this.fromExistingAsset); } throw error; } return new class extends InitFile { _doBind(bindOptions) { asset.grantRead(bindOptions.instanceRole); return { config: this._standardConfig(options, bindOptions.platform, { source: asset.httpUrl, }), authentication: standardS3Auth(bindOptions.instanceRole, asset.s3BucketName), assetHash: asset.assetHash, }; } }(targetFileName, options); } /** @internal */ _bind(bindOptions) { for (const handle of this.options.serviceRestartHandles ?? []) { handle._addFile(this.fileName); } return this._doBind(bindOptions); } /** * Render the standard config block, given content vars * @internal */ _standardConfig(fileOptions, platform, contentVars) { if (platform === cfn_init_internal_1.InitPlatform.WINDOWS) { if (fileOptions.group || fileOptions.owner || fileOptions.mode) { throw new Error('Owner, group, and mode options not supported for Windows.'); } return { [this.fileName]: { ...contentVars }, }; } return { [this.fileName]: { ...contentVars, mode: fileOptions.mode || '000644', owner: fileOptions.owner || 'root', group: fileOptions.group || 'root', }, }; } } exports.InitFile = InitFile; _e = JSII_RTTI_SYMBOL_1; InitFile[_e] = { fqn: "@aws-cdk/aws-ec2.InitFile", version: "1.204.0" }; /** * Create Linux/UNIX groups and assign group IDs. * * Not supported for Windows systems. */ class InitGroup extends InitElement { constructor(groupName, groupId) { super(); this.groupName = groupName; this.groupId = groupId; this.elementType = cfn_init_internal_1.InitElementType.GROUP.toString(); } /** * Create a group from its name, and optionally, group id */ static fromName(groupName, groupId) { return new InitGroup(groupName, groupId); } /** @internal */ _bind(options) { if (options.platform === cfn_init_internal_1.InitPlatform.WINDOWS) { throw new Error('Init groups are not supported on Windows'); } return { config: { [this.groupName]: this.groupId !== undefined ? { gid: this.groupId } : {}, }, }; } } exports.InitGroup = InitGroup; _f = JSII_RTTI_SYMBOL_1; InitGroup[_f] = { fqn: "@aws-cdk/aws-ec2.InitGroup", version: "1.204.0" }; /** * Create Linux/UNIX users and to assign user IDs. * * Users are created as non-interactive system users with a shell of * /sbin/nologin. This is by design and cannot be modified. * * Not supported for Windows systems. */ class InitUser extends InitElement { constructor(userName, userOptions) { super(); this.userName = userName; this.userOptions = userOptions; this.elementType = cfn_init_internal_1.InitElementType.USER.toString(); try { jsiiDeprecationWarnings._aws_cdk_aws_ec2_InitUserOptions(userOptions); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, InitUser); } throw error; } } /** * Create a user from user name. */ static fromName(userName, options = {}) { try { jsiiDeprecationWarnings._aws_cdk_aws_ec2_InitUserOptions(options); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, this.fromName); } throw error; } return new InitUser(userName, options); } /** @internal */ _bind(options) { if (options.platform === cfn_init_internal_1.InitPlatform.WINDOWS) { throw new Error('Init users are not supported on Windows'); } return { config: { [this.userName]: { uid: this.userOptions.userId, groups: this.userOptions.groups, homeDir: this.userOptions.homeDir, }, }, }; } } exports.InitUser = InitUser; _g = JSII_RTTI_SYMBOL_1; InitUser[_g] = { fqn: "@aws-cdk/aws-ec2.InitUser", version: "1.204.0" }; /** * A package to be installed during cfn-init time */ class InitPackage extends InitElement { constructor(type, versions, packageName, serviceHandles) { super(); this.type = type; this.versions = versions; this.packageName = packageName; this.serviceHandles = serviceHandles; this.elementType = cfn_init_internal_1.InitElementType.PACKAGE.toString(); } /** * Install an RPM from an HTTP URL or a location on disk */ static rpm(location, options = {}) { try { jsiiDeprecationWarnings._aws_cdk_aws_ec2_LocationPackageOptions(options); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, this.rpm); } throw error; } return new InitPackage('rpm', [location], options.key, options.serviceRestartHandles); } /** * Install a package using Yum */ static yum(packageName, options = {}) { try { jsiiDeprecationWarnings._aws_cdk_aws_ec2_NamedPackageOptions(options); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, this.yum); } throw error; } return new InitPackage('yum', options.version ?? [], packageName, options.serviceRestartHandles); } /** * Install a package from RubyGems */ static rubyGem(gemName, options = {}) { try { jsiiDeprecationWarnings._aws_cdk_aws_ec2_NamedPackageOptions(options); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, this.rubyGem); } throw error; } return new InitPackage('rubygems', options.version ?? [], gemName, options.serviceRestartHandles); } /** * Install a package from PyPI */ static python(packageName, options = {}) { try { jsiiDeprecationWarnings._aws_cdk_aws_ec2_NamedPackageOptions(options); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, this.python); } throw error; } return new InitPackage('python', options.version ?? [], packageName, options.serviceRestartHandles); } /** * Install a package using APT */ static apt(packageName, options = {}) { try { jsiiDeprecationWarnings._aws_cdk_aws_ec2_NamedPackageOptions(options); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, this.apt); } throw error; } return new InitPackage('apt', options.version ?? [], packageName, options.serviceRestartHandles); } /** * Install an MSI package from an HTTP URL or a location on disk */ static msi(location, options = {}) { try { jsiiDeprecationWarnings._aws_cdk_aws_ec2_LocationPackageOptions(options); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, this.msi); } throw error; } // The MSI package version must be a string, not an array. return new class extends InitPackage { renderPackageVersions() { return location; } }('msi', [location], options.key, options.serviceRestartHandles); } /** @internal */ _bind(options) { if ((this.type === 'msi') !== (options.platform === cfn_init_internal_1.InitPlatform.WINDOWS)) { if (this.type === 'msi') { throw new Error('MSI installers are only supported on Windows systems.'); } else { throw new Error('Windows only supports the MSI package type'); } } if (!this.packageName && !['rpm', 'msi'].includes(this.type)) { throw new Error('Package name must be specified for all package types besides RPM and MSI.'); } const packageName = this.packageName || `${options.index}`.padStart(3, '0'); for (const handle of this.serviceHandles ?? []) { handle._addPackage(this.type, packageName); } return { config: { [this.type]: { [packageName]: this.renderPackageVersions(), }, }, }; } renderPackageVersions() { return this.versions; } } exports.InitPackage = InitPackage; _h = JSII_RTTI_SYMBOL_1; InitPackage[_h] = { fqn: "@aws-cdk/aws-ec2.InitPackage", version: "1.204.0" }; /** * A services that be enabled, disabled or restarted when the instance is launched. */ class InitService extends InitElement { constructor(serviceName, serviceOptions) { super(); this.serviceName = serviceName; this.serviceOptions = serviceOptions; this.elementType = cfn_init_internal_1.InitElementType.SERVICE.toString(); } /** * Enable and start the given service, optionally restarting it */ static enable(serviceName, options = {}) { try { jsiiDeprecationWarnings._aws_cdk_aws_ec2_InitServiceOptions(options); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, this.enable); } throw error; } const { enabled, ensureRunning, ...otherOptions } = options; return new InitService(serviceName, { enabled: enabled ?? true, ensureRunning: ensureRunning ?? enabled ?? true, ...otherOptions, }); } /** * Disable and stop the given service */ static disable(serviceName) { return new InitService(serviceName, { enabled: false, ensureRunning: false }); } /** @internal */ _bind(options) { const serviceManager = options.platform === cfn_init_internal_1.InitPlatform.LINUX ? 'sysvinit' : 'windows'; return { config: { [serviceManager]: { [this.serviceName]: { enabled: this.serviceOptions.enabled, ensureRunning: this.serviceOptions.ensureRunning, ...this.serviceOptions.serviceRestartHandle?._renderRestartHandles(), }, }, }, }; } } exports.InitService = InitService; _j = JSII_RTTI_SYMBOL_1; InitService[_j] = { fqn: "@aws-cdk/aws-ec2.InitService", version: "1.204.0" }; /** * Extract an archive into a directory */ class InitSource extends InitElement { constructor(targetDirectory, serviceHandles) { super(); this.targetDirectory = targetDirectory; this.serviceHandles = serviceHandles; this.elementType = cfn_init_internal_1.InitElementType.SOURCE.toString(); } /** * Retrieve a URL and extract it into the given directory */ static fromUrl(targetDirectory, url, options = {}) { try { jsiiDeprecationWarnings._aws_cdk_aws_ec2_InitSourceOptions(options); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, this.fromUrl); } throw error; } return new class extends InitSource { _doBind() { return { config: { [this.targetDirectory]: url }, }; } }(targetDirectory, options.serviceRestartHandles); } /** * Extract a GitHub branch into a given directory */ static fromGitHub(targetDirectory, owner, repo, refSpec, options = {}) { try { jsiiDeprecationWarnings._aws_cdk_aws_ec2_InitSourceOptions(options); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, this.fromGitHub); } throw error; } return InitSource.fromUrl(targetDirectory, `https://github.com/${owner}/${repo}/tarball/${refSpec ?? 'master'}`, options); } /** * Extract an archive stored in an S3 bucket into the given directory */ static fromS3Object(targetDirectory, bucket, key, options = {}) { try { jsiiDeprecationWarnings._aws_cdk_aws_ec2_InitSourceOptions(options); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, this.fromS3Object); } throw error; } return new class extends InitSource { _doBind(bindOptions) { bucket.grantRead(bindOptions.instanceRole, key); return { config: { [this.targetDirectory]: bucket.urlForObject(key) }, authentication: standardS3Auth(bindOptions.instanceRole, bucket.bucketName), }; } }(targetDirectory, options.serviceRestartHandles); } /** * Create an InitSource from an asset created from the given path. */ static fromAsset(targetDirectory, path, options = {}) { try { jsiiDeprecationWarnings._aws_cdk_aws_ec2_InitSourceAssetOptions(options); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, this.fromAsset); } throw error; } return new class extends InitSource { _doBind(bindOptions) { const asset = new s3_assets.Asset(bindOptions.scope, `${targetDirectory}Asset`, { path, ...bindOptions, }); asset.grantRead(bindOptions.instanceRole); return { config: { [this.targetDirectory]: asset.httpUrl }, authentication: standardS3Auth(bindOptions.instanceRole, asset.s3BucketName), assetHash: asset.assetHash, }; } }(targetDirectory, options.serviceRestartHandles); } /** * Extract a directory from an existing directory asset. */ static fromExistingAsset(targetDirectory, asset, options = {}) { try { jsiiDeprecationWarnings._aws_cdk_aws_ec2_InitSourceOptions(options); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, this.fromExistingAsset); } throw error; } return new class extends InitSource { _doBind(bindOptions) { asset.grantRead(bindOptions.instanceRole); return { config: { [this.targetDirectory]: asset.httpUrl }, authentication: standardS3Auth(bindOptions.instanceRole, asset.s3BucketName), assetHash: asset.assetHash, }; } }(targetDirectory, options.serviceRestartHandles); } /** @internal */ _bind(options) { for (const handle of this.serviceHandles ?? []) { handle._addSource(this.targetDirectory); } // Delegate actual bind to subclasses return this._doBind(options); } } exports.InitSource = InitSource; _k = JSII_RTTI_SYMBOL_1; InitSource[_k] = { fqn: "@aws-cdk/aws-ec2.InitSource", version: "1.204.0" }; /** * Render a standard S3 auth block for use in AWS::CloudFormation::Authentication * * This block is the same every time (modulo bucket name), so it has the same * key every time so the blocks are merged into one in the final render. */ function standardS3Auth(role, bucketName) { return { S3AccessCreds: { type: 'S3', roleName: role.roleName, buckets: [bucketName], }, }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2ZuLWluaXQtZWxlbWVudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjZm4taW5pdC1lbGVtZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSx5QkFBeUI7QUFHekIsb0RBQW9EO0FBQ3BELHdDQUF5QztBQUN6QyxtRUFBZ0g7QUFFaEg7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILE1BQWEsd0JBQXdCO0lBQXJDO1FBQ21CLGFBQVEsR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO1FBQy9CLFVBQUssR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO1FBQzVCLFlBQU8sR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO1FBQzlCLGFBQVEsR0FBNkIsRUFBRSxDQUFDO0tBbUQxRDtJQWpEQzs7O09BR0c7SUFDSSxXQUFXLENBQUMsR0FBVztRQUM1QixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ2hDO0lBRUQ7OztPQUdHO0lBQ0ksUUFBUSxDQUFDLEdBQVc7UUFDekIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUM3QjtJQUVEOzs7T0FHRztJQUNJLFVBQVUsQ0FBQyxHQUFXO1FBQzNCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDL0I7SUFFRDs7O09BR0c7SUFDSSxXQUFXLENBQUMsV0FBbUIsRUFBRSxHQUFXO1FBQ2pELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQy9CLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDO1NBQ2pDO1FBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDdEM7SUFFRDs7O09BR0c7SUFDSSxxQkFBcUI7UUFD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