Skip to content

Instantly share code, notes, and snippets.

@WolfangAukang
Created April 30, 2024 13:05

Revisions

  1. WolfangAukang created this gist Apr 30, 2024.
    63 changes: 63 additions & 0 deletions main.rs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,63 @@
    use aws_config::{meta::region::RegionProviderChain, BehaviorVersion, SdkConfig};
    use aws_sdk_ec2::Client;

    const DEFAULT_REGION: &str = "us-east-1";
    const INSTANCE_ID_STATUS: &str = "i-0d10de49d69d7ed57";
    const INSTANCE_ID_START: &str = "i-06360477f59dd461d";

    enum InstanceStatus {
    IP,
    Status,
    }

    async fn generate_config() -> SdkConfig {
    let region_provider = RegionProviderChain::default_provider().or_else(DEFAULT_REGION);
    aws_config::defaults(BehaviorVersion::latest())
    .region(region_provider)
    .load()
    .await
    }

    async fn start_instance() -> Result<Option<String>, aws_sdk_ec2::Error> {
    let instance_id = std::env::var("INSTANCE_ID").expect("missing INSTANCE_ID");
    let config = generate_config().await;
    let client = Client::new(&config);
    let resp = client
    .start_instances()
    .instance_ids(instance_id)
    .send()
    .await?;
    for instance in resp.starting_instances() {
    let prev_state = instance.previous_state().unwrap();
    let prev_state_name = prev_state.name().unwrap();
    return Ok(Some(String::from(prev_state_name.as_str())));
    }
    Ok(None)
    }

    async fn get_instance_property(
    property: InstanceStatus,
    ) -> Result<Option<String>, aws_sdk_ec2::Error> {
    let instance_id = std::env::var("INSTANCE_ID").expect("missing INSTANCE_ID");
    let config = generate_config().await;
    let client = Client::new(&config);
    let resp = client
    .describe_instances()
    .instance_ids(instance_id)
    .send()
    .await?;
    for reservation in resp.reservations() {
    for instance in reservation.instances() {
    println!("Instance ID: {}", instance.instance_id().unwrap());
    match property {
    InstanceStatus::IP => return Ok(instance.public_ip_address.clone()),
    InstanceStatus::Status => {
    let status = instance.state().unwrap();
    let status_name = status.name().unwrap();
    return Ok(Some(String::from(status_name.as_str())));
    }
    }
    }
    }
    Ok(None)
    }