in src/aws.js [93:140]
async function createEc2InstanceWithParams(imageId, subnetId, securityGroupId, label, githubRegistrationToken, region) {
// If multiple instance types are provided, use EC2 Fleet (instant) to create an instance
if (Array.isArray(config.input.ec2InstanceTypes) && config.input.ec2InstanceTypes.length > 0) {
return await createEc2InstanceWithFleetParams(imageId, subnetId, securityGroupId, label, githubRegistrationToken, region);
}
// else, use RunInstances to create instance with fixed instance type
// Region is always specified now, so we can directly use it
const ec2ClientOptions = { region };
const ec2 = new EC2Client(ec2ClientOptions);
const userData = buildUserDataScript(githubRegistrationToken, label);
core.info('Executing user data script: ' + userData.replace(githubRegistrationToken, '<redacted>'));
const params = {
ImageId: imageId,
InstanceType: config.input.ec2InstanceType,
MaxCount: 1,
MinCount: 1,
SecurityGroupIds: [securityGroupId],
SubnetId: subnetId,
UserData: Buffer.from(userData).toString('base64'),
IamInstanceProfile: config.input.iamRoleName ? { Name: config.input.iamRoleName } : undefined,
TagSpecifications: config.tagSpecifications,
InstanceMarketOptions: buildMarketOptions(),
MetadataOptions: Object.keys(config.input.metadataOptions).length > 0 ? config.input.metadataOptions : undefined,
};
if (config.input.ec2VolumeSize !== '' || config.input.ec2VolumeType !== '') {
params.BlockDeviceMappings = [
{
DeviceName: config.input.ec2DeviceName,
Ebs: {
...(config.input.ec2VolumeSize !== '' && { VolumeSize: config.input.ec2VolumeSize }),
...(config.input.ec2VolumeType !== '' && { VolumeType: config.input.ec2VolumeType }),
},
},
];
}
if (config.input.blockDeviceMappings.length > 0) {
params.BlockDeviceMappings = config.input.blockDeviceMappings;
}
const result = await ec2.send(new RunInstancesCommand(params));
const ec2InstanceId = result.Instances[0].InstanceId;
return ec2InstanceId;
}