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, 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, 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) }