def test_get_aws_client(self): with patch('aws_gate.utils._create_aws_session', return_value=MagicMock()) as mock: get_aws_client(service_name='ec2', region_name='eu-west-1') self.assertTrue(mock.called) self.assertEqual( mock.mock_calls, [call(profile_name=None, region_name='eu-west-1')])
def test_get_aws_client(mocker): mock = mocker.patch( "aws_gate.utils._create_aws_session", return_value=mocker.MagicMock() ) get_aws_client(service_name="ec2", region_name="eu-west-1") assert mock.called assert mock.mock_calls == [mocker.call(profile_name=None, region_name="eu-west-1")]
def ssh( config, instance_name, user=DEFAULT_OS_USER, port=DEFAULT_SSH_PORT, key_type=DEFAULT_KEY_ALGORITHM, key_size=DEFAULT_KEY_SIZE, profile_name=AWS_DEFAULT_PROFILE, region_name=AWS_DEFAULT_REGION, command=None, forwarding=None, ): instance, profile, region = fetch_instance_details_from_config( config, instance_name, profile_name, region_name) ssm = get_aws_client("ssm", region_name=region, profile_name=profile) ec2 = get_aws_resource("ec2", region_name=region, profile_name=profile) ec2_ic = get_aws_client("ec2-instance-connect", region_name=region, profile_name=profile) instance_id = query_instance(name=instance, ec2=ec2) if instance_id is None: raise ValueError( "No instance could be found for name: {}".format(instance)) az = get_instance_details(instance_id=instance_id, ec2=ec2)["availability_zone"] logger.info( "Opening SSH session on instance %s (%s) via profile %s", instance_id, region, profile, ) with SshKey(key_type=key_type, key_size=key_size) as ssh_key: with SshKeyUploader(instance_id=instance_id, az=az, user=user, ssh_key=ssh_key, ec2_ic=ec2_ic): with SshSession( instance_id, region_name=region, profile_name=profile, ssm=ssm, port=port, user=user, command=command, forwarding=forwarding, ) as ssh_session: ssh_session.open()
def exec( config, instance_name, command, profile_name=AWS_DEFAULT_PROFILE, region_name=AWS_DEFAULT_REGION, ): instance, profile, region = fetch_instance_details_from_config( config, instance_name, profile_name, region_name) ssm = get_aws_client("ssm", region_name=region, profile_name=profile) ec2 = get_aws_resource("ec2", region_name=region, profile_name=profile) instance_id = query_instance(name=instance, ec2=ec2) if instance_id is None: raise ValueError(f"No instance could be found for name: {instance}") logger.info( 'Executing command "%s" on instance %s (%s) via profile %s', " ".join(command), instance_id, region, profile, ) with ExecSession(instance_id, command, region_name=region, ssm=ssm) as sess: sess.open()
def session(config, instance_name, profile_name='default', region_name='eu-west-1'): if not is_existing_profile(profile_name): raise ValueError('Invalid profile provided: {}'.format(profile_name)) if not is_existing_region(region_name): raise ValueError('Invalid region provided: {}'.format(profile_name)) config_data = config.get_host(instance_name) if config_data and config_data['name'] and config_data[ 'profile'] and config_data['region']: region = config_data['region'] profile = config_data['profile'] instance = config_data['name'] else: region = region_name profile = profile_name instance = instance_name ssm = get_aws_client('ssm', region_name=region, profile_name=profile) ec2 = get_aws_resource('ec2', region_name=region, profile_name=profile) instance_id = query_instance(name=instance, ec2=ec2) if instance_id is None: raise ValueError( 'No instance could be found for name: {}'.format(instance)) logger.info('Opening session on instance %s (%s) via profile %s', instance_id, region_name, profile_name) with Session(instance_id, region_name=region_name, ssm=ssm) as sess: sess.open()
def session( config, instance_name, profile_name=AWS_DEFAULT_PROFILE, region_name=AWS_DEFAULT_REGION, ): instance, profile, region = fetch_instance_details_from_config( config, instance_name, profile_name, region_name ) ssm = get_aws_client("ssm", region_name=region, profile_name=profile) ec2 = get_aws_resource("ec2", region_name=region, profile_name=profile) instance_id = query_instance(name=instance, ec2=ec2) if instance_id is None: raise ValueError("No instance could be found for name: {}".format(instance)) logger.info( "Opening session on instance %s (%s) via profile %s", instance_id, region, profile, ) with SSMSession(instance_id, region_name=region, ssm=ssm) as sess: sess.open()
def list_instances( profile_name=AWS_DEFAULT_PROFILE, region_name=AWS_DEFAULT_REGION, output_format=DEFAULT_LIST_OUTPUT, fields=DEFAULT_LIST_HUMAN_FIELDS, ): invalid_fields = list(set(fields) - set(DEFAULT_LIST_OUTPUT_FIELDS)) if invalid_fields: raise ValueError( 'Invalid fields provided: "{}". Valid fields: "{}"'.format( " ".join(invalid_fields), " ".join(DEFAULT_LIST_OUTPUT_FIELDS))) ssm = get_aws_client("ssm", region_name=region_name, profile_name=profile_name) ec2 = get_aws_resource("ec2", region_name=region_name, profile_name=profile_name) instances_ssm_paginator = ssm.get_paginator( "describe_instance_information") instances_ssm_response_iterator = instances_ssm_paginator.paginate() instance_ids = [] for response in instances_ssm_response_iterator: for instance in response["InstanceInformationList"]: instance_ids.append(instance["InstanceId"]) instance_details = get_multiple_instance_details(instance_ids=instance_ids, ec2=ec2) print( serialize(instance_details, output_format=output_format, fields=fields).rstrip())
def ssh_proxy(config, instance_name, user=DEFAULT_OS_USER, port=DEFAULT_SSH_PORT, key_type=DEFAULT_KEY_ALGORITHM, key_size=DEFAULT_KEY_SIZE, profile_name=AWS_DEFAULT_PROFILE, region_name=AWS_DEFAULT_REGION): instance, profile, region = fetch_instance_details_from_config(config, instance_name, profile_name, region_name) ssm = get_aws_client('ssm', region_name=region, profile_name=profile) ec2 = get_aws_resource('ec2', region_name=region, profile_name=profile) ec2_ic = get_aws_client('ec2-instance-connect', region_name=region, profile_name=profile) instance_id = query_instance(name=instance, ec2=ec2) if instance_id is None: raise ValueError('No instance could be found for name: {}'.format(instance)) az = get_instance_details(instance_id=instance_id, ec2=ec2)['availability_zone'] logger.info('Opening SSH proxy session on instance %s (%s) via profile %s', instance_id, region, profile) with SshKey(key_type=key_type, key_size=key_size) as ssh_key: with SshKeyUploader(instance_id=instance_id, az=az, user=user, ssh_key=ssh_key, ec2_ic=ec2_ic): with SshProxySession(instance_id, region_name=region, profile_name=profile, ssm=ssm, port=port, user=user) as ssh_proxy_session: ssh_proxy_session.open()
def session(instance_name, profile_name=None, region_name='eu-west-1'): ssm = get_aws_client('ssm', region_name=region_name, profile_name=profile_name) ec2 = get_aws_resource('ec2', region_name=region_name, profile_name=profile_name) instance_id = query_instance(name=instance_name, ec2=ec2) if instance_id is None: raise ValueError( 'No instance could be found for name: {}'.format(instance_name)) logger.info('Opening session on instance %s (%s) via profile %s', instance_id, region_name, profile_name) with Session(instance_id, region_name=region_name, ssm=ssm) as sess: sess.open()
def list_instances(profile_name=AWS_DEFAULT_PROFILE, region_name=AWS_DEFAULT_REGION): ssm = get_aws_client('ssm', region_name=region_name, profile_name=profile_name) ec2 = get_aws_resource('ec2', region_name=region_name, profile_name=profile_name) instances_ssm_paginator = ssm.get_paginator('describe_instance_information') instances_ssm_response_iterator = instances_ssm_paginator.paginate() instance_ids = [] for response in instances_ssm_response_iterator: for instance in response['InstanceInformationList']: instance_ids.append(instance['InstanceId']) for instance in ec2.instances.filter(InstanceIds=instance_ids): instance_name = "" for tags in instance.tags: if tags["Key"] == 'Name': instance_name = tags["Value"] print("{} - {}".format(instance.instance_id, instance_name))