2

I was working on an AWS SDK version 3 and was trying to create an AMI from an EC2 instance programmatically. The following is the script I use:

// Imports
// TODO: Import the ec2 client

const {
  EC2Client,
  CreateImageCommand
} = require('@aws-sdk/client-ec2')

function sendCommand (command) {
  const client = new EC2Client({ region: process.env.AWS_REGION })
  return client.send(command)
}

createImage('i-0672b492fb7f92bfd', 'hamsterImage')
  .then(() => console.log('Complete'))

async function createImage (seedInstanceId, imageName) {
  // TODO: Implement AMI creation
  const params = {
    InstanceId: seedInstanceId,
    Name: imageName
  };
  const command = new CreateImageCommand(params);
  return sendCommand(params);
}

The Instance ID was captured from the following JSON object for listing all the running instance on my code

[
  {
    AmiLaunchIndex: 0,
    ImageId: 'ami-0b5eea76982371e91',    
    InstanceId: 'i-0672b492fb7f92bfd',   
    InstanceType: 't2.micro',
    KernelId: undefined,
    KeyName: 'hamster_key',
    LaunchTime: 2022-12-27T03:10:12.000Z,
    Monitoring: { State: 'disabled' },   
    Placement: {
      AvailabilityZone: 'us-east-1c',    
      Affinity: undefined,
      GroupName: '',
      PartitionNumber: undefined,        
      HostId: undefined,
      Tenancy: 'default',
      SpreadDomain: undefined,
      HostResourceGroupArn: undefined
    },
    Platform: undefined,
    PrivateDnsName: 'ip-172-31-80-74.ec2.internal',
    PrivateIpAddress: '172.31.80.74',
    ProductCodes: [],
    PublicDnsName: 'ec2-54-162-64-244.compute-1.amazonaws.com',
    PublicIpAddress: '54.162.64.244',
    RamdiskId: undefined,
    State: { Code: 16, Name: 'running' },
    StateTransitionReason: '',
    SubnetId: 'subnet-09fbb143b92cb9d1b',
    VpcId: 'vpc-0ba9dffc72ac05ef6',
    Architecture: 'x86_64',
    BlockDeviceMappings: [ [Object] ],
    ClientToken: 'bd84c832-4429-482d-bdf9-323ddbb8cad4',
    EbsOptimized: false,
    EnaSupport: true,
    Hypervisor: 'xen',
    IamInstanceProfile: undefined,
    InstanceLifecycle: undefined,
    ElasticGpuAssociations: undefined,
    ElasticInferenceAcceleratorAssociations: undefined,
    NetworkInterfaces: [ [Object] ],
    OutpostArn: undefined,
    RootDeviceName: '/dev/xvda',
    RootDeviceType: 'ebs',
    SecurityGroups: [ [Object] ],
    SourceDestCheck: true,
    SpotInstanceRequestId: undefined,
    SriovNetSupport: undefined,
    StateReason: undefined,
    Tags: undefined,
    VirtualizationType: 'hvm',
    CpuOptions: { CoreCount: 1, ThreadsPerCore: 1 },
    CapacityReservationId: undefined,
    CapacityReservationSpecification: {
      CapacityReservationPreference: 'open',
      CapacityReservationTarget: undefined
    },
    HibernationOptions: { Configured: false },
    Licenses: undefined,
    MetadataOptions: {
      State: 'applied',
      HttpTokens: 'optional',
      HttpPutResponseHopLimit: 1,
      HttpEndpoint: 'enabled',
      HttpProtocolIpv6: 'disabled'
    },
    EnclaveOptions: { Enabled: false },
    BootMode: undefined
  }
]

The error I got was

C:\Users\jiali\OneDrive\Desktop\aws-developer-designing-developing\03\demos\before\node_modules\@aws-sdk\smithy-client\dist\cjs\client.js:13
        const handler = command.resolveMiddleware(this.middlewareStack, this.config, options);                                ^

TypeError: command.resolveMiddleware is not a function
    at EC2Client.send (C:\Users\jiali\OneDrive\Desktop\aws-developer-designing-developing\03\demos\before\node_modules\@aws-sdk\smithy-client\dist\cjs\client.js:13:33)
    at sendCommand (C:\Users\jiali\OneDrive\Desktop\aws-developer-designing-developing\03\demos\before\scripts\03\create-ami.js:11:17)
    at createImage (C:\Users\jiali\OneDrive\Desktop\aws-developer-designing-developing\03\demo
PS C:\Users\jiali\OneDrive\Desktop\aws-developer-designing-developing\03\demos\before\scripts\03> node .\manage-ec2-instance.js

I was confused as to why, is there any error on my code?

Danny Shen
  • 53
  • 4
  • I also have this on the RDSClient `TypeError: command.resolveMiddleware is not a function at RDSClient.send (/var/runtime/node_modules/@aws-sdk/smithy-client/dist-cjs/client.js:13:33)` – Mike Smith Jan 31 '23 at 09:40

1 Answers1

1

Turns out you had the same issue I did which was accidentally forgetting to pass in the actual command object.

You use the params to build the command object but execute sendCommand with params instead of command as the parameter.

You should be executing sendCommand(command); and not sendCommand(params);

Mike Smith
  • 574
  • 5
  • 6