Example #1
0
    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')])
Example #2
0
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")]
Example #3
0
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()
Example #4
0
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()
Example #5
0
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()
Example #6
0
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()
Example #7
0
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())
Example #8
0
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()
Example #9
0
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()
Example #10
0
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))