diff --git a/action.yml b/action.yml index 0cea738b..367bea03 100644 --- a/action.yml +++ b/action.yml @@ -27,7 +27,8 @@ inputs: required: false subnet-id: description: >- - VPC Subnet Id. The subnet should belong to the same VPC as the specified security group. + VPC Subnet Id. You may provide a comma-separated list of subnet ids to try multiple subnets. + The subnet should belong to the same VPC as the specified security group. This input is required if you use the 'start' mode. required: false security-group-id: diff --git a/src/aws.js b/src/aws.js index 028dca42..08270897 100644 --- a/src/aws.js +++ b/src/aws.js @@ -35,27 +35,32 @@ async function startEc2Instance(label, githubRegistrationToken) { const userData = buildUserDataScript(githubRegistrationToken, label); - const params = { - ImageId: config.input.ec2ImageId, - InstanceType: config.input.ec2InstanceType, - MinCount: 1, - MaxCount: 1, - UserData: Buffer.from(userData.join('\n')).toString('base64'), - SubnetId: config.input.subnetId, - SecurityGroupIds: [config.input.securityGroupId], - IamInstanceProfile: { Name: config.input.iamRoleName }, - TagSpecifications: config.tagSpecifications, - }; + const subnetId = config.input.subnetId; + const subnets = subnetId ? subnetId.replace(/\s/g, '').split(',') : [null]; - try { - const result = await ec2.runInstances(params).promise(); - const ec2InstanceId = result.Instances[0].InstanceId; - core.info(`AWS EC2 instance ${ec2InstanceId} is started`); - return ec2InstanceId; - } catch (error) { - core.error('AWS EC2 instance starting error'); - throw error; + for (const subnet of subnets) { + const params = { + ImageId: config.input.ec2ImageId, + InstanceType: config.input.ec2InstanceType, + MinCount: 1, + MaxCount: 1, + UserData: Buffer.from(userData.join('\n')).toString('base64'), + SubnetId: subnet, + SecurityGroupIds: [config.input.securityGroupId], + IamInstanceProfile: { Name: config.input.iamRoleName }, + TagSpecifications: config.tagSpecifications, + }; + try { + const result = await ec2.runInstances(params).promise(); + const ec2InstanceId = result.Instances[0].InstanceId; + core.info(`AWS EC2 instance ${ec2InstanceId} is started`); + return ec2InstanceId; + } catch (error) { + core.warning('AWS EC2 instance starting error'); + core.warning(error); + } } + core.setFailed(`Failed to launch instance after trying in ${subnets.length} subnets.`); } async function terminateEc2Instance() {