@aws-cdk/aws-ec2
Version:
The CDK Construct Library for AWS::EC2
875 lines • 91.1 kB
JavaScript
"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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