diff --git a/aliases b/aliases index 3dcccdb..64ef79a 100644 --- a/aliases +++ b/aliases @@ -1,49 +1,6 @@ # DO NOT MANUALLY MODIFY THIS FILE. # Use 'scripts/build' to regenerate if required. -alias __bma-using-aws-cli-v1='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma __bma-using-aws-cli-v1' -alias __bma_error='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma __bma_error' -alias __bma_read_filters='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma __bma_read_filters' -alias __bma_read_filters-az='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma __bma_read_filters-az' -alias __bma_read_inputs='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma __bma_read_inputs' -alias __bma_read_stdin='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma __bma_read_stdin' -alias __bma_usage='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma __bma_usage' -alias _bma_derive_params_from_stack_and_template='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma _bma_derive_params_from_stack_and_template' -alias _bma_derive_params_from_template='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma _bma_derive_params_from_template' -alias _bma_derive_stack_from_params='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma _bma_derive_stack_from_params' -alias _bma_derive_stack_from_template='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma _bma_derive_stack_from_template' -alias _bma_derive_template_from_params='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma _bma_derive_template_from_params' -alias _bma_derive_template_from_stack='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma _bma_derive_template_from_stack' -alias _bma_stack_args='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma _bma_stack_args' -alias _bma_stack_capabilities='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma _bma_stack_capabilities' -alias _bma_stack_diff_params='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma _bma_stack_diff_params' -alias _bma_stack_diff_template='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma _bma_stack_diff_template' -alias _bma_stack_name_arg='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma _bma_stack_name_arg' -alias _bma_stack_params_arg='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma _bma_stack_params_arg' -alias _bma_stack_template_arg='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma _bma_stack_template_arg' -alias ad-app='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma ad-app' -alias ad-app-owners='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma ad-app-owners' -alias ad-apps='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma ad-apps' -alias ad-group-members='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma ad-group-members' -alias ad-groups='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma ad-groups' -alias ad-user-group-diff='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma ad-user-group-diff' -alias ad-user-groups='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma ad-user-groups' -alias ad-user-names='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma ad-user-names' -alias ad-user-upns='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma ad-user-upns' -alias ad-users='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma ad-users' -alias ad-users-graph='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma ad-users-graph' -alias afd-custom-domains='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma afd-custom-domains' -alias afd-custom-domains-validation-request='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma afd-custom-domains-validation-request' -alias afd-endpoints='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma afd-endpoints' -alias afd-origin-groups='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma afd-origin-groups' -alias afd-routes='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma afd-routes' -alias afd-waf-policies='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma afd-waf-policies' -alias afd-waf-policy='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma afd-waf-policy' -alias afd-waf-policy-rule-delete='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma afd-waf-policy-rule-delete' -alias afd-waf-policy-rule-match-condition-values='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma afd-waf-policy-rule-match-condition-values' -alias afd-waf-policy-rule-match-conditions='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma afd-waf-policy-rule-match-conditions' -alias afd-waf-policy-rules='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma afd-waf-policy-rules' -alias afds='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma afds' alias asg-capacity='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma asg-capacity' alias asg-desired-size-set='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma asg-desired-size-set' alias asg-detach-instances='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma asg-detach-instances' @@ -64,46 +21,18 @@ alias aws-account-each='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma aws-account-each alias aws-account-id='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma aws-account-id' alias aws-accounts='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma aws-accounts' alias aws-panopticon='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma aws-panopticon' -alias az-account='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma az-account' -alias az-cache-item='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma az-cache-item' -alias az-cache-item-delete='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma az-cache-item-delete' -alias az-cache-items='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma az-cache-items' -alias az-user='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma az-user' alias backup-jobs='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma backup-jobs' -alias bucket-acls='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma bucket-acls' -alias bucket-remove='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma bucket-remove' -alias bucket-remove-force='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma bucket-remove-force' -alias bucket-size='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma bucket-size' -alias buckets='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma buckets' -alias cert-chain='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma cert-chain' -alias cert-delete='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma cert-delete' -alias cert-ificate='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma cert-ificate' -alias cert-resource-record-valid='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma cert-resource-record-valid' -alias cert-users='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma cert-users' -alias cert-verify='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma cert-verify' -alias certs='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma certs' -alias certs-arn='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma certs-arn' alias cloudtrail-status='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma cloudtrail-status' alias cloudtrails='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma cloudtrails' -alias cloudwatch-alarm-actions-disable='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma cloudwatch-alarm-actions-disable' -alias cloudwatch-alarm-actions-enable='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma cloudwatch-alarm-actions-enable' -alias cloudwatch-alarm-delete='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma cloudwatch-alarm-delete' -alias cloudwatch-alarms='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma cloudwatch-alarms' alias columnise='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma columnise' -alias connector-group-apps='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma connector-group-apps' -alias connector-group-members='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma connector-group-members' -alias connector-groups='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma connector-groups' -alias connectors='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma connectors' -alias debug='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma debug' -alias deployment-delete-danger='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma deployment-delete-danger' +alias deployment='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma deployment' alias deployment-groups='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma deployment-groups' -alias deployments-group='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma deployments-group' +alias deployments='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma deployments' alias distributions='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma distributions' -alias domain-autorenew-disable='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma domain-autorenew-disable' -alias domain-autorenew-enable='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma domain-autorenew-enable' -alias domains='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma domains' alias ecr-repositories='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma ecr-repositories' alias ecr-repository-images='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma ecr-repository-images' +alias elasticache-replication-groups='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma elasticache-replication-groups' +alias elasticaches='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma elasticaches' alias elb-azs='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma elb-azs' alias elb-dnsname='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma elb-dnsname' alias elb-instances='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma elb-instances' @@ -112,57 +41,18 @@ alias elb-subnets='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma elb-subnets' alias elb-tag='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma elb-tag' alias elb-tags='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma elb-tags' alias elbs='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma elbs' +alias elbv2-arn='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma elbv2-arn' alias elbv2-azs='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma elbv2-azs' alias elbv2-dnsname='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma elbv2-dnsname' alias elbv2-subnets='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma elbv2-subnets' alias elbv2-target-groups='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma elbv2-target-groups' alias elbv2s='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma elbv2s' -alias hosted-zone-delete='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma hosted-zone-delete' -alias hosted-zone-ns-records='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma hosted-zone-ns-records' -alias hosted-zones='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma hosted-zones' alias iam-access-key-rotate='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma iam-access-key-rotate' alias iam-role-principal='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma iam-role-principal' alias iam-roles='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma iam-roles' alias iam-users='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma iam-users' alias image-deregister='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma image-deregister' alias images='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma images' -alias instance-asg='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma instance-asg' -alias instance-az='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma instance-az' -alias instance-console='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma instance-console' -alias instance-dns='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma instance-dns' -alias instance-health-set-unhealthy='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma instance-health-set-unhealthy' -alias instance-iam-profile='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma instance-iam-profile' -alias instance-ip='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma instance-ip' -alias instance-profile='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma instance-profile' -alias instance-profile-role='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma instance-profile-role' -alias instance-rdp='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma instance-rdp' -alias instance-ssh='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma instance-ssh' -alias instance-ssh-details='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma instance-ssh-details' -alias instance-ssm='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma instance-ssm' -alias instance-ssm-platform-type='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma instance-ssm-platform-type' -alias instance-ssm-port-forward='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma instance-ssm-port-forward' -alias instance-stack='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma instance-stack' -alias instance-start='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma instance-start' -alias instance-state='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma instance-state' -alias instance-stop='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma instance-stop' -alias instance-stop-protection='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma instance-stop-protection' -alias instance-stop-protection-disable='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma instance-stop-protection-disable' -alias instance-stop-protection-enable='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma instance-stop-protection-enable' -alias instance-subnet='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma instance-subnet' -alias instance-tag='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma instance-tag' -alias instance-tag-create='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma instance-tag-create' -alias instance-tag-delete='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma instance-tag-delete' -alias instance-tags='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma instance-tags' -alias instance-tags-v2='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma instance-tags-v2' -alias instance-terminate='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma instance-terminate' -alias instance-termination-protection='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma instance-termination-protection' -alias instance-termination-protection-disable='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma instance-termination-protection-disable' -alias instance-termination-protection-enable='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma instance-termination-protection-enable' -alias instance-type='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma instance-type' -alias instance-userdata='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma instance-userdata' -alias instance-volumes='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma instance-volumes' -alias instance-vpc='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma instance-vpc' -alias instances='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma instances' alias keypair-create='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma keypair-create' alias keypair-delete='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma keypair-delete' alias keypairs='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma keypairs' @@ -183,123 +73,18 @@ alias lambda-function-memory-step='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma lambd alias lambda-functions='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma lambda-functions' alias launch-configuration-asgs='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma launch-configuration-asgs' alias launch-configurations='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma launch-configurations' -alias location='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma location' -alias location-each='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma location-each' -alias location-unset='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma location-unset' -alias locations='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma locations' +alias log-group-delete='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma log-group-delete' alias log-groups='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma log-groups' -alias management-groups='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma management-groups' -alias network-interfaces='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma network-interfaces' -alias nics='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma nics' -alias pcxs='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma pcxs' -alias private-dns-zone-a-record-add='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma private-dns-zone-a-record-add' -alias private-dns-zone-a-record-delete='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma private-dns-zone-a-record-delete' -alias private-dns-zone-record-sets='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma private-dns-zone-record-sets' -alias private-dns-zones='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma private-dns-zones' -alias private-endpoint-custom-dns-configs='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma private-endpoint-custom-dns-configs' -alias private-endpoints='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma private-endpoints' alias rds-db-clusters='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma rds-db-clusters' alias rds-db-instances='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma rds-db-instances' -alias region-each='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma region-each' -alias regions='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma regions' -alias resource-diff='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma resource-diff' -alias resource-export='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma resource-export' -alias resource-group='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma resource-group' -alias resource-group-export='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma resource-group-export' -alias resource-group-unset='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma resource-group-unset' -alias resource-groups='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma resource-groups' -alias resource-show='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma resource-show' -alias resourceids='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma resourceids' -alias resources='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma resources' +alias region='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma region' alias secrets='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma secrets' -alias service-principals='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma service-principals' -alias skim-stdin='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma skim-stdin' -alias skim-stdin-bma='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma skim-stdin-bma' -alias skim-stdin-tsv='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma skim-stdin-tsv' -alias ssm-association-execution-targets='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma ssm-association-execution-targets' -alias ssm-association-executions='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma ssm-association-executions' -alias ssm-associations='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma ssm-associations' -alias ssm-automation-execution='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma ssm-automation-execution' -alias ssm-automation-execution-failures='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma ssm-automation-execution-failures' -alias ssm-automation-executions='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma ssm-automation-executions' -alias ssm-automation-step-executions='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma ssm-automation-step-executions' -alias ssm-instances='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma ssm-instances' -alias ssm-parameter-value='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma ssm-parameter-value' -alias ssm-parameters='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma ssm-parameters' -alias ssm-send-command='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma ssm-send-command' -alias ssm-send-command-windows='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma ssm-send-command-windows' -alias stack-arn='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma stack-arn' -alias stack-asg-instances='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma stack-asg-instances' -alias stack-asgs='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma stack-asgs' -alias stack-cancel-update='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma stack-cancel-update' -alias stack-create='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma stack-create' -alias stack-delete='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma stack-delete' -alias stack-diff='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma stack-diff' -alias stack-drift-detect='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma stack-drift-detect' -alias stack-drift-resources='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma stack-drift-resources' -alias stack-drift-status='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma stack-drift-status' -alias stack-elbs='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma stack-elbs' -alias stack-events='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma stack-events' -alias stack-exports='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma stack-exports' -alias stack-failure='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma stack-failure' -alias stack-instances='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma stack-instances' -alias stack-outputs='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma stack-outputs' -alias stack-parameters='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma stack-parameters' -alias stack-recreate='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma stack-recreate' -alias stack-resources='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma stack-resources' -alias stack-status='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma stack-status' -alias stack-tag='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma stack-tag' -alias stack-tags='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma stack-tags' -alias stack-tags-text='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma stack-tags-text' -alias stack-tail='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma stack-tail' -alias stack-template='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma stack-template' -alias stack-template-changeset-latest='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma stack-template-changeset-latest' -alias stack-update='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma stack-update' -alias stack-validate='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma stack-validate' -alias stacks='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma stacks' alias sts-assume-role='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma sts-assume-role' -alias subnet-ips='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma subnet-ips' -alias subnets='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma subnets' -alias subscription='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma subscription' -alias subscription-each='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma subscription-each' -alias subscription-unset='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma subscription-unset' -alias subscriptions='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma subscriptions' -alias subscriptions-each='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma subscriptions-each' -alias tag-keys='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma tag-keys' -alias tag-split='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma tag-split' -alias tag-values='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma tag-values' alias target-group-targets='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma target-group-targets' alias target-groups='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma target-groups' -alias vnet-dns-resolvers='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma vnet-dns-resolvers' -alias vnet-subnets='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma vnet-subnets' -alias vnets='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma vnets' -alias vpc-az-count='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma vpc-az-count' -alias vpc-azs='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma vpc-azs' -alias vpc-default-delete='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma vpc-default-delete' -alias vpc-dhcp-options-ntp='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma vpc-dhcp-options-ntp' -alias vpc-endpoint-policy='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma vpc-endpoint-policy' -alias vpc-endpoint-services='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma vpc-endpoint-services' -alias vpc-endpoints='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma vpc-endpoints' -alias vpc-igw='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma vpc-igw' -alias vpc-lambda-functions='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma vpc-lambda-functions' -alias vpc-nat-gateways='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma vpc-nat-gateways' -alias vpc-network-acls='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma vpc-network-acls' -alias vpc-rds='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma vpc-rds' -alias vpc-route-tables='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma vpc-route-tables' -alias vpc-subnets='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma vpc-subnets' -alias vpcs='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma vpcs' +alias trim_date='${BMA_HOME:-$HOME/.bash-my-aws}/bin/bma trim_date' # We'll find a less suprising place for this in future # region() needs to be a function in order to let it # set AWS_DEFAULT_REGION in the current shell -function region() { - local inputs=$(skim-stdin "$@"); - if [[ -z "$inputs" ]]; then - echo "${AWS_DEFAULT_REGION:-'AWS_DEFAULT_REGION not set'}"; - else - export AWS_DEFAULT_REGION="$inputs"; - if [[ -n $AWS_REGION ]]; then - export AWS_REGION="$AWS_DEFAULT_REGION"; - fi; - fi -} +function region() diff --git a/bash_completion.sh b/bash_completion.sh index fa6b710..258366c 100644 --- a/bash_completion.sh +++ b/bash_completion.sh @@ -172,19 +172,6 @@ complete -F _bma_asgs_completion asgs complete -F _bma_aws-accounts_completion aws-account-cost-explorer complete -F _bma_aws-accounts_completion aws-account-cost-recommendations complete -F _bma_aws-accounts_completion aws-accounts -complete -F _bma_buckets_completion bucket-acls -complete -F _bma_buckets_completion bucket-remove -complete -F _bma_buckets_completion bucket-remove-force -complete -F _bma_buckets_completion bucket-size -complete -F _bma_buckets_completion buckets -complete -F _bma_certs_completion cert-chain -complete -F _bma_certs_completion cert-delete -complete -F _bma_certs_completion cert-ificate -complete -F _bma_certs_completion cert-resource-record-valid -complete -F _bma_certs_completion cert-users -complete -F _bma_certs_completion cert-verify -complete -F _bma_certs_completion certs -complete -F _bma_certs_completion certs-arn complete -F _bma_elbs_completion elb-azs complete -F _bma_elbs_completion elb-dnsname complete -F _bma_elbs_completion elb-instances @@ -193,88 +180,15 @@ complete -F _bma_elbs_completion elb-subnets complete -F _bma_elbs_completion elb-tag complete -F _bma_elbs_completion elb-tags complete -F _bma_elbs_completion elbs +complete -F _bma_elbv2s_completion elbv2-arn complete -F _bma_elbv2s_completion elbv2-azs complete -F _bma_elbv2s_completion elbv2-dnsname complete -F _bma_elbv2s_completion elbv2-subnets complete -F _bma_elbv2s_completion elbv2-target-groups complete -F _bma_elbv2s_completion elbv2s -complete -F _bma_instances_completion instance-asg -complete -F _bma_instances_completion instance-az -complete -F _bma_instances_completion instance-console -complete -F _bma_instances_completion instance-dns -complete -F _bma_instances_completion instance-health-set-unhealthy -complete -F _bma_instances_completion instance-iam-profile -complete -F _bma_instances_completion instance-ip -complete -F _bma_instances_completion instance-profile -complete -F _bma_instances_completion instance-profile-role -complete -F _bma_instances_completion instance-rdp -complete -F _bma_instances_completion instance-ssh -complete -F _bma_instances_completion instance-ssh-details -complete -F _bma_instances_completion instance-ssm -complete -F _bma_instances_completion instance-ssm-platform-type -complete -F _bma_instances_completion instance-ssm-port-forward -complete -F _bma_instances_completion instance-stack -complete -F _bma_instances_completion instance-start -complete -F _bma_instances_completion instance-state -complete -F _bma_instances_completion instance-stop -complete -F _bma_instances_completion instance-stop-protection -complete -F _bma_instances_completion instance-stop-protection-disable -complete -F _bma_instances_completion instance-stop-protection-enable -complete -F _bma_instances_completion instance-subnet -complete -F _bma_instances_completion instance-tag -complete -F _bma_instances_completion instance-tag-create -complete -F _bma_instances_completion instance-tag-delete -complete -F _bma_instances_completion instance-tags -complete -F _bma_instances_completion instance-tags-v2 -complete -F _bma_instances_completion instance-terminate -complete -F _bma_instances_completion instance-termination-protection -complete -F _bma_instances_completion instance-termination-protection-disable -complete -F _bma_instances_completion instance-termination-protection-enable -complete -F _bma_instances_completion instance-type -complete -F _bma_instances_completion instance-userdata -complete -F _bma_instances_completion instance-volumes -complete -F _bma_instances_completion instance-vpc -complete -F _bma_instances_completion instances complete -F _bma_keypairs_completion keypair-delete complete -F _bma_keypairs_completion keypairs -complete -F _bma_regions_completion region -complete -F _bma_stacks_completion stack-arn -complete -F _bma_stacks_completion stack-asg-instances -complete -F _bma_stacks_completion stack-asgs -complete -F _bma_stacks_completion stack-cancel-update -complete -F _bma_stacks_completion stack-delete -complete -F _bma_stacks_completion stack-diff -complete -F _bma_stacks_completion stack-drift-detect -complete -F _bma_stacks_completion stack-drift-resources -complete -F _bma_stacks_completion stack-drift-status -complete -F _bma_stacks_completion stack-elbs -complete -F _bma_stacks_completion stack-events -complete -F _bma_stacks_completion stack-exports -complete -F _bma_stacks_completion stack-failure -complete -F _bma_stacks_completion stack-instances -complete -F _bma_stacks_completion stack-outputs -complete -F _bma_stacks_completion stack-parameters -complete -F _bma_stacks_completion stack-recreate -complete -F _bma_stacks_completion stack-resources -complete -F _bma_stacks_completion stack-status -complete -F _bma_stacks_completion stack-tail -complete -F _bma_stacks_completion stack-template -complete -F _bma_stacks_completion stack-template-changeset-latest -complete -F _bma_stacks_completion stack-update -complete -F _bma_stacks_completion stacks complete -F _bma_target-groups_completion target-group-targets complete -F _bma_target-groups_completion target-groups -complete -F _bma_vpcs_completion vpc-az-count -complete -F _bma_vpcs_completion vpc-azs -complete -F _bma_vpcs_completion vpc-endpoint-policy -complete -F _bma_vpcs_completion vpc-endpoints -complete -F _bma_vpcs_completion vpc-igw -complete -F _bma_vpcs_completion vpc-lambda-functions -complete -F _bma_vpcs_completion vpc-nat-gateways -complete -F _bma_vpcs_completion vpc-network-acls -complete -F _bma_vpcs_completion vpc-rds -complete -F _bma_vpcs_completion vpc-route-tables -complete -F _bma_vpcs_completion vpc-subnets -complete -F _bma_vpcs_completion vpcs complete -f stack-validate complete -F _bma_completion bma diff --git a/docs/command-reference.md b/docs/command-reference.md index 0a132dd..701c1a0 100644 --- a/docs/command-reference.md +++ b/docs/command-reference.md @@ -204,7 +204,7 @@ Create a CloudFormation Stack to take advantage of shorter commands* USAGE: stack-create stack [template-file] [parameters-file] \ - [--capabilities=OPTIONAL_VALUE] [--role-arn=OPTIONAL_VALUE] + [CAPABILITY_1 CAPABILITY_2] [--role-arn=OPTIONAL_VALUE] $ stack-create params/asg-params-prod.json Resolved arguments: asg-prod ./asg.yml params/asg-params-prod.json @@ -408,7 +408,7 @@ Show all events for CF stack until update completes or fails. ### stack-template -Return template of a stack +Return template of each stack ### stack-template-changeset-latest @@ -437,6 +437,21 @@ List outputs of a stack Validate a stack template +### stack-detect-drift + +Detect drift for provided stacks; and print coloured diff + + +### stack-describe-drift + +List stack-tags applied to a stack + + +### stack-diff-drift + +List stack-tags applied to a stack + + ### stack-diff Compare live stack against local template (and optional params file) @@ -573,6 +588,13 @@ List EC2 Instances i-806d8f1592e2a2efd ami-123456789012 t3.nano running postgres2 2019-12-10T08:17:22.000Z ap-southeast-2a None +### instance-id + +Just return the instance ID of whatever was passed in (so you can run a for loop, for instance) + + USAGE: instances [grep] | instance-id + + ### instance-asg List autoscaling group membership of EC2 Instance(s) @@ -976,6 +998,18 @@ List CloudFormation stack for asg(s) List scaling activities for Autoscaling Group(s) +## autoscaling-commands + + +### ##scaling-ecs + +List autoscaling actions +filter by environment (eg test1) or namespace (eg ecs) +if you pass an argument, it'll filter for clusters whose ARN contains your text + + $ scaling-ecs 'test.*down' # list the scale-down times of all our test environments + + ## azure-commands @@ -1510,6 +1544,25 @@ List Cloudwatch Alarms +## codedeploy-commands + + +### deployment + +List deployments + + +### deployments + +List all deployment IDs for a deployment group (not useful for the user, only internal) +# ?? if no deployment group, could we list all deployments for this application, with their groups and statuses? + + +### deployment-groups + +List all deployment groups for an application + + ## domain-commands @@ -1552,6 +1605,196 @@ List ECR Repositories List images for ECR Repositories +## ecs-commands + + +### ecs-clusters + +List ECS clusters +output includes clusterName,status,activeServicesCount,runningTasksCount,pendingTasksCount +if you pass an argument, it'll filter for clusters whose ARN contains your text + + $ ecs-clusters test + test-octopus-ecs-cluster ACTIVE 1 1 0 + test1-ecs-cluster ACTIVE 3 1 0 + test3-ecs-cluster ACTIVE 3 1 0 + test2-ecs-cluster ACTIVE 3 3 0 + + +### ecs-services + +List ECS services +output includes serviceName,status,desiredCount,runningCount,pendingCount,createdAt + +gets all clusters if no filter passed in +if you do pass a filter: +1. if your filter is the name of one of your clusters, it will list the services in that cluster (eg ecs-clusters test1 | ecs-services) +2. if your filter is not a cluster name, it will list the services in all clusters whose names match your filter (ie it filters on cluster name not service name) +3. if you do not pass a filter, it will list all services in all clusters + + $ ecs-clusters test1|ecs-services + test1-ecs-admin-7URaUr0YGJHi ACTIVE 0 0 0 2023-09-13T17:16:48.198000+10:00 + test1-ecs-public-wEaTAqGXqbpq ACTIVE 0 0 0 2023-09-13T16:54:54.162000+10:00 + test1-ecs-hangfire-YNIo1hlx8rjn ACTIVE 1 1 0 2023-09-13T16:39:06.218000+10:00 + + +### ecs-tasks + +List ECS tasks +output includes taskDefinitionArn, createdAt, cpu, memory + +gets all tasks if no filter passed in +if you do pass a filter, it filters on the task name. All clusters are included (I haven't worked out a way of passing a cluster name AND a filter) + + $ ecs-tasks test2 + arn:aws:ecs:ap-southeast-2:xxxxxxxxxxxx:task-definition/test2-public:18 2023-09-19T17:51:56.418000+10:00 2048 4096 + arn:aws:ecs:ap-southeast-2:xxxxxxxxxxxx:task-definition/test2-admin:20 2023-08-29T10:03:36.956000+10:00 2048 4096 + arn:aws:ecs:ap-southeast-2:xxxxxxxxxxxx:task-definition/test2-hangfire:22 2023-09-19T17:11:06.622000+10:00 1024 2048 + + +### ecs-scaling-activities + +List autoscaling activities - the actual scaling events that have happened +eg +ecs-scaling www +2023-11-22T06:24:50.937000+11:00 www-ecs-public-ServicePublic-OuN3rXBLvmx3-AlarmLow-64de4512-d901-4b26-a6a2-184bb1e90bc6 in state ALARM triggered policy www-ecs-public-target-tracking-mem70 Successfully set desired count to 2. Change successfully fulfilled by ecs. +2023-11-22T05:25:48.611000+11:00 www-ecs-public-ServicePublic-OuN3rXBLvmx3-AlarmHigh-6408c172-647e-4c0e-aac9-a800cd83317d in state ALARM triggered policy www-ecs-public-target-tracking-mem70 Successfully set desired count to 3. Change successfully fulfilled by ecs. + + +### ecs-scaling-actions + +List autoscaling actions - cron-based scheduled scaling +filter by environment (eg test1) or namespace (eg ecs) +if you pass an argument, it'll filter for clusters whose ARN contains your text + + $ scaling-ecs 'test.*down' # list the scale-down times of all our test environments + + +## ecs-commands~ + + +### ecs-clusters + +List ECS clusters +output includes clusterName,status,activeServicesCount,runningTasksCount,pendingTasksCount +if you pass an argument, it'll filter for clusters whose ARN contains your text + + $ ecs-clusters test + test-octopus-ecs-cluster ACTIVE 1 1 0 + test1-ecs-cluster ACTIVE 3 1 0 + test3-ecs-cluster ACTIVE 3 1 0 + test2-ecs-cluster ACTIVE 3 3 0 + + +### ecs-services + +List ECS services +output includes serviceName,status,desiredCount,runningCount,pendingCount,createdAt + +gets all clusters if no filter passed in +if you do pass a filter: +1. if your filter is the name of one of your clusters, it will list the services in that cluster (eg ecs-clusters test1 | ecs-services) +2. if your filter is not a cluster name, it will list the services in all clusters whose names match your filter (ie it filters on cluster name not service name) +3. if you do not pass a filter, it will list all services in all clusters + + $ ecs-clusters test1|ecs-services + test1-ecs-admin-7URaUr0YGJHi ACTIVE 0 0 0 2023-09-13T17:16:48.198000+10:00 + test1-ecs-public-wEaTAqGXqbpq ACTIVE 0 0 0 2023-09-13T16:54:54.162000+10:00 + test1-ecs-hangfire-YNIo1hlx8rjn ACTIVE 1 1 0 2023-09-13T16:39:06.218000+10:00 + + +### ecs-tasks + +List ECS tasks +output includes name:version, createdAt, cpu, memory + +gets all tasks if no filter passed in +if you do pass a filter, it filters on the task name. All clusters are included (I haven't worked out a way of passing a cluster name AND a filter) + + $ ecs-tasks test2 + arn:aws:ecs:ap-southeast-2:xxxxxxxxxxxx:task-definition/test2-public:18 2023-09-19T17:51:56.418000+10:00 2048 4096 + arn:aws:ecs:ap-southeast-2:xxxxxxxxxxxx:task-definition/test2-admin:20 2023-08-29T10:03:36.956000+10:00 2048 4096 + arn:aws:ecs:ap-southeast-2:xxxxxxxxxxxx:task-definition/test2-hangfire:22 2023-09-19T17:11:06.622000+10:00 1024 2048 + + +### ecs-task-details + +List ECS tasks +output includes name:version, taskDefinitionArn, status, createdAt, cpu, memory + +gets all tasks if no filter passed in +if you do pass a filter, it filters on the task name. All clusters are included (I haven't worked out a way of passing a cluster name AND a filter) + + $ ecs-tasks test2 + arn:aws:ecs:ap-southeast-2:xxxxxxxxxxxx:task-definition/test2-public:18 2023-09-19T17:51:56.418000+10:00 2048 4096 + 5d6a2107-5723-44ac-8cdc-2c0dbeb8f69e 10.156.46.146 + arn:aws:ecs:ap-southeast-2:xxxxxxxxxxxx:task-definition/test2-admin:20 2023-08-29T10:03:36.956000+10:00 2048 4096 + 934e4ca3-3d11-42fb-aadf-483e88f59d7c 10.156.30.66 + arn:aws:ecs:ap-southeast-2:xxxxxxxxxxxx:task-definition/test2-hangfire:22 2023-09-19T17:11:06.622000+10:00 1024 2048 + 6a37c83e-dc85-473c-8a79-7023f85bd052 10.156.54.40 + + +### ecs-scaling-activities + +List autoscaling activities - the actual scaling events that have happened +eg +ecs-scaling www +2023-11-22T06:24:50.937000+11:00 www-ecs-public-ServicePublic-OuN3rXBLvmx3-AlarmLow-64de4512-d901-4b26-a6a2-184bb1e90bc6 in state ALARM triggered policy www-ecs-public-target-tracking-mem70 Successfully set desired count to 2. Change successfully fulfilled by ecs. +2023-11-22T05:25:48.611000+11:00 www-ecs-public-ServicePublic-OuN3rXBLvmx3-AlarmHigh-6408c172-647e-4c0e-aac9-a800cd83317d in state ALARM triggered policy www-ecs-public-target-tracking-mem70 Successfully set desired count to 3. Change successfully fulfilled by ecs. + + +### ecs-scaling-actions + +List autoscaling actions - cron-based scheduled scaling +filter by environment (eg test1) or namespace (eg ecs) +if you pass an argument, it'll filter for clusters whose ARN contains your text + + $ scaling-ecs 'test.*down' # list the scale-down times of all our test environments + + +## elasticache-commands + + +### elasticaches + +List elasticache thingies (code borrowed from target-groups) + + $ target-groups + bash-my-aws-nlb-tg TCP 22 vpc-04636ebe5573f6f65 instance bash-my-aws-nlb + bash-my-aws-alb-tg HTTP 443 vpc-04636ebe5573f6f65 instance bash-my-aws-alb + + +### elasticache-replication-groups + + +Accepts a string to filter on +This is not very useful without column headings. +Most of the things you want to know about a replication group are boolean +eg AutomaticFailover, MultiAZClusterEnabled, AtRestEncryptionEnabled etc + + +## elasticache-commands-littlelaptop + + +### elasticaches + +List elasticache thingies + + $ target-groups + bash-my-aws-nlb-tg TCP 22 vpc-04636ebe5573f6f65 instance bash-my-aws-nlb + bash-my-aws-alb-tg HTTP 443 vpc-04636ebe5573f6f65 instance bash-my-aws-alb + + +### elasticache-replication-groups + + +Accepts Target Group names on stdin or as arguments + + $ target-group-targets bash-my-aws-nlb-tg + i-4e15ece1de1a3f869 443 healthy bash-my-aws-nlb-tg + i-89cefa9403373d7a5 443 unhealthy bash-my-aws-nlb-tg + + ## elb-commands @@ -1644,6 +1887,17 @@ Accepts Load Balancer names on STDIN and converts to Network Load Balancer names bash-my-aws-alb application internet-facing provisioning 2020-01-04T11:29:45.030Z +### elbv2-arn + +List DNS Names of elbv2(s) + + USAGE: elbv2-dnsname load-balancer [load-balancer] + + $ elbv2s | elbv2-dnsname + bash-my-aws bash-my-aws-c23c598688520e51.elb.ap-southeast-2.amazonaws.com + bash-my-aws-alb bash-my-aws-alb-2036199590.ap-southeast-2.elb.amazonaws.com + + ### elbv2-dnsname List DNS Names of elbv2(s) @@ -1989,6 +2243,21 @@ List CloudWatch Log Groups /aws/lambda/walk 1576567300172 0 11794 +### log-group-delete + +Delete CloudWatch Log Group + + $ log-group-delete /aws/lambda/stars + You are about to delete the following log groups? + /aws/lambda/stars + Are you sure? [y/N] y + Deleting: /aws/lambda/stars + Deleted: /aws/lambda/stars + + You can also pipe the log group names to this command + $ log-groups | log-group-delete + + ## rds-commands @@ -2032,6 +2301,32 @@ Generate NS records for delegating domain to AWS bash-my-aws.org. 300 IN NS ns-1464.awsdns-55.org. +### hosted-zone-records + +List Records in a Route53 Hosted Zone +NOTE: AWS alias records are shown with a fake TTL of 86400. + + $ hosted-zones bash-my-aws.org + /hostedzone/ZJ6ZCG2UD6OKX 5 NotPrivateZone bash-my-aws.org. + + $ hosted-zones bash-my-aws.org | hosted-zone-records + bash-my-aws.org. 900 SOA ns-1549.awsdns-01.co.uk. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400 + bash-my-aws.org. 300 NS ns-1464.awsdns-55.org. + bash-my-aws.org. 300 A 185.199.108.153 + bash-my-aws.org. 300 A 185.199.109.153 + bash-my-aws.org. 300 TXT "google-site-verification=RbKejqu95y4Q78BkWnjaiM0rl6SYugtTdVLexK35b2k" + lb.bash-my-aws.org. 86400 ALIAS dualstack.lb-bmaorg-12345.us-east-1.elb.amazonaws.com + + +### hosted-zone-a-records + +Generate NS records for delegating domain to AWS + + $ hosted-zone-a-records bash-my-aws.org + + $ hosted-zones | hosted-zone-a-records + + ### hosted-zone-delete Delete Route53 hosted zones @@ -2340,6 +2635,222 @@ Print SSM Parameter Value +### instance-ssm-platform-type + +Show platform type (OS) for instance + + USAGE: instance-ssm-platform-type instance-id [instance-id] + + $ instances | instance-ssm-platform-type + i-0c1d2e3f4a567890b None + i-0d1c2b3a4e5f6789c Linux + i-0e1f2d3c4b5a6789d Linux + i-0f1e2d3c4b5a6789e None + i-0a9f8e7d6c5b4a312 None + i-01b2a3c4d5e6f7893 Windows + + +## ssm-commands~ + + +### ssm-instances + +List Instances known to SSM + + USAGE: ssm-instances [filter] + + $ ssm-instances + i-00a123b456d789012 Online Amazon Linux 2 192.168.1.10 server001.example.com + i-01b234c567e890123 Online Microsoft Windows Server 2019 Datacenter 10.0.17763 192.168.1.20 winserver002.example.com + i-02c345d678f901234 Online Ubuntu 20.04 192.168.1.30 ubuntu003.example.com + i-03d456e789a012345 Online Ubuntu 20.04 192.168.1.40 ubuntu004.example.com + i-04e567f89b1234567 Online Amazon Linux 2 192.168.1.50 server005.example.com + *Optionally provide a filter string for a `| grep` effect with tighter columisation:* + + $ ssm-instances Windows + i-00a123b456d789012 Online Microsoft Windows Server 2019 Datacenter 68.0.11111 192.168.1.10 server001.example.com + i-01b234c567e890123 Online Microsoft Windows Server 2022 Datacenter 68.0.11112 192.168.1.20 winserver002.example.com + + +### ssm-send-command + +Run a command locally on EC2 instance(s) running Linux + + USAGE: ssm-send-command COMMAND instance-id [instance-id] + + $ ssm-send-command 'date +%F' i-0fict1234abcd + Command ID: 12345abc-de67-f890-gh12-34ij56kl789m + Waiting for command to complete... + i-0fict1234abcd 2023-12-01 + + $ ssm-instances | grep Linux | ssm-send-command 'date +%F' + Command ID: 98b7c6d2-e3f4-11ac-8d20-47a56db09c8f + Waiting for command to complete... + i-0fake1234a567bcd 2023-12-01 + i-0fake2345b678cde 2023-12-01 + i-0fake3456c789def 2023-11-30 + i-0fake4567d890efa 2023-11-30 + i-0fake5678e901fgh 2023-12-01 + i-0fake6789f012ghi 2023-12-01 + + See also: ssm-send-command-windows +Escape double quotes in command +Send command + + +### ssm-send-command-windows + +Run a command locally on EC2 instance(s) running Windows + + USAGE: ssm-send-command-windows COMMAND instance-id [instance-id] + + $ ssm-send-command 'Get-Hotfix' i-0fict1234abcd + Command ID: 12345abc-de67-f890-gh12-34ij56kl789m + Waiting for command to complete... + i-0fict1234abcd 2023-12-01 + + $ ssm-instances Windows | ssm-send-command-windows Get-Hotfix + Command ID: a0eeeddc-2edf-42bc-b0c7-122f5bc50956 + Waiting for command to complete... + i-0fake1234abcd + Source Description HotFixID InstalledBy InstalledOn + ------ ----------- -------- ----------- ----------- + FAKEAPP01234 Update KB1234567 NT AUTHORITY\SYSTEM 10/11/2023 12:00:00 AM + FAKEAPP01234 Update KB8901234 NT AUTHORITY\SYSTEM 12/12/2018 12:00:00 AM + FAKEAPP01234 Security Update KB5678901 NT AUTHORITY\SYSTEM 12/12/2018 12:00:00 AM + FAKEAPP01234 Update KB2345678 NT AUTHORITY\SYSTEM 1/9/2019 12:00:00 AM + FAKEAPP01234 Update KB3456789 NT AUTHORITY\SYSTEM 3/11/2021 12:00:00 AM + FAKEAPP01234 Security Update KB4567890 NT AUTHORITY\SYSTEM 4/21/2019 12:00:00 AM + FAKEAPP01234 Security Update KB5678901 NT AUTHORITY\SYSTEM 5/15/2019 12:00:00 AM + FAKEAPP01234 Security Update KB6789012 NT AUTHORITY\SYSTEM 6/12/2019 12:00:00 AM + ---Output truncated--- + i-0fake1234abcd + Source Description HotFixID InstalledBy InstalledOn + ------ ----------- -------- ----------- ----------- + FAKEAPP01234 Update KB1234567 NT AUTHORITY\SYSTEM 10/11/2023 12:00:00 AM + FAKEAPP01234 Update KB8901234 NT AUTHORITY\SYSTEM 12/12/2018 12:00:00 AM + FAKEAPP01234 Security Update KB5678901 NT AUTHORITY\SYSTEM 12/12/2018 12:00:00 AM + + See also: ssm-send-command-windows + + +### ssm-automation-executions + +List recent SSM Automation Executions +USAGE: ssm-automation-executions [filter] + + $ ssm-automation-executions + 1234abcd-ef56-7890-gh12-ijk3456lmnop UpdateAndSecureNodes None Failed 2023-07-20T09:00:00.000000+00:00 None + 5678efgh-ijkl-9012-mnop-qrstuvwx3456 UpdateAndSecureNodes i-0a1b2c3d4e5f67890 Failed 2023-07-20T09:00:10.000000+00:00 None + 90abijkl-mnop-4567-qrst-uvwxyza12345 UpdateAndSecureNodes i-1b2c3d4e5f6g78901 Failed 2023-07-20T09:00:20.000000+00:00 None + cdefmnop-qrst-8910-uvwx-yzab1234cdef UpdateAndSecureNodes i-2c3d4e5f6g7h89012 Failed 2023-07-20T09:00:30.000000+00:00 None + ghijqrst-uvwx-2345-yzab-abcd5678efgh UpdateAndSecureNodes i-3d4e5f6g7h8i90123 Failed 2023-07-20T09:00:40.000000+00:00 None + + +### ssm-automation-execution-failures + + + +### ssm-automation-step-executions + +Show step-by-step details for an SSM Automation Execution + + USAGE: automation-execution-steps execution_id [execution_id] + + $ ssm-automation-executions | ssm-automation-steps-executions + [Outputs detailed step information for each provided execution ID] + + +### ssm-automation-execution + +Show details for an SSM Automation Execution + + USAGE: ssm-automation-execution execution_id [execution_id] + + $ ssm-automation-executions | head | ssm-automation-execution + 1234abcd-5678-9def-ghij-klmnopqrstuv DeployNewFeatures i-01234a5b6c7d8e9f0 Failed 2023-09-10T10:10:10.000000+00:00 2023-09-10T10:10:20.000000+00:00 + 9876fedc-ba98-7654-c321-onmlkjihgfed DeployNewFeatures i-09876b5c4d3e2f1g0 Failed 2023-09-10T10:20:30.000000+00:00 2023-09-10T10:20:40.000000+00:00 + abcd1234-efgh-5678-ijkl-9mnopq7rstuv DeployNewFeatures i-0a1b2c3d4e5f6g7h8 Failed 2023-09-10T10:30:50.000000+00:00 2023-09-10T10:31:00.000000+00:00 + ijkl8765-ghij-4321-klmn-5opq4rstu3vw DeployNewFeatures i-0i8j7k6l5m4n3o2p1 Failed 2023-09-10T10:40:10.000000+00:00 2023-09-10T10:40:20.000000+00:00 + + +### ssm-associations + +List SSM associations + + USAGE: ssm-associations [filter] + + $ ssm-associations + Task-RunSecurityScan cron(30 2 * * SUN) 2023-01-15T02:30:00.000000+00:00 Failed + Task-UpdateSystemPackages cron(0 4 * * SAT) 2023-04-22T04:00:00.000000+00:00 Success + Service-ConfigureNetworkSettings rate(7 days) 2023-05-07T11:00:00.000000+00:00 Success + Script-DeployMonitoringTools cron(15 3 * * FRI) 2023-03-03T03:15:00.000000+00:00 Failed + + +### ssm-association-executions + +List SSM Association Executions + + USAGE: ssm-associations [filter] + + $ ssm-associations + 12345678-9abc-def0-1234-56789abcdef0 a1b2c3d4-e5f6-7890-a1b2-c3d4e5f67890 Success {Success=10} 2023-07-21T10:30:00.000000+00:00 + 12345678-9abc-def0-1234-56789abcdef0 b1c2d3e4-f5g6-7890-b1c2-d3e4f5g67890 Success {Success=15} 2023-07-22T11:00:00.000000+00:00 + 12345678-9abc-def0-1234-56789abcdef0 c1d2e3f4-g5h6-7890-c1d2-e3f4g5h67890 Success {Success=13} 2023-07-23T09:45:00.000000+00:00 + 12345678-9abc-def0-1234-56789abcdef0 d1e2f3g4-h5i6-7890-d1e2-f3g4h5i67890 Failed {Failed=2, Success=12} 2023-07-24T12:30:00.000000+00:00 + 12345678-9abc-def0-1234-56789abcdef0 e1f2g3h4-i5j6-7890-e1f2-g3h4i5j67890 Failed {Failed=3, Success=11} 2023-07-25T14:15:00.000000+00:00 + + +### ssm-association-execution-targets + +List targets for SSM Association Execution + + USAGE: ssm-association-execution-targets association-id execution-id + + $ association-execution-targets abcd1234-ef56-7890-gh12-ijk3456lmnop 12345678-90ab-cdef-1234-567890abcdef + abcd1234-ef56-7890-gh12-ijk3456lmnop 12345678-90ab-cdef-1234-567890abcdef i-01234abcde56789f0 Success Success 2023-08-10T11:30:00.000000+00:00 + abcd1234-ef56-7890-gh12-ijk3456lmnop 12345678-90ab-cdef-1234-567890abcdef i-02345bcdef67891g1 Success Success 2023-08-10T11:30:10.000000+00:00 + abcd1234-ef56-7890-gh12-ijk3456lmnop 12345678-90ab-cdef-1234-567890abcdef i-03456cdefg78912h2 Success Success 2023-08-10T11:30:20.000000+00:00 + abcd1234-ef56-7890-gh12-ijk3456lmnop 12345678-90ab-cdef-1234-567890abcdef i-04567defgh89123i3 Success Success 2023-08-10T11:30:30.000000+00:00 + +Note: Can't use skim-stdin as it requires to arguments + + +### ssm-parameters + +List SSM Parameters + + USAGE: ssm-parameters [filter] + + $ ssm-parameters + /company/ad/a1234567/username + /ami/Ubuntu-20.04-proxy + /cloudwatch-agent/config/general + /cnf/staticSite/B1P2V34SR5KF0Z/encryptionKeyArn + /ops/CloudMetrics/linux + /ops/CloudMetrics/windows + + +### ssm-parameter-value + +Print SSM Parameter Value + + USAGE: ssm-parameter-value ssm-parameter [ssm-parameter] + + $ ssm-parameters | ssm-parameter-value + /ops/Monitoring/metrics/unix + { + "agent": { + "metrics_collection_interval": 60, + "logfile": "/var/log/aws-monitoring/aws-monitoring-agent.log" + }, + "logs": { + "logs_collected": { + "files": { + +another way to avoid ThrottlingException is to use get-parameters which takes an array of up to 10 params + + ### instance-ssm-platform-type Show platform type (OS) for instance diff --git a/functions b/functions index 4d4cd43..153f540 100644 --- a/functions +++ b/functions @@ -1,49 +1,6 @@ # DO NOT MANUALLY MODIFY THIS FILE. # Use 'scripts/build' to regenerate if required. -__bma-using-aws-cli-v1 -__bma_error -__bma_read_filters -__bma_read_filters-az -__bma_read_inputs -__bma_read_stdin -__bma_usage -_bma_derive_params_from_stack_and_template -_bma_derive_params_from_template -_bma_derive_stack_from_params -_bma_derive_stack_from_template -_bma_derive_template_from_params -_bma_derive_template_from_stack -_bma_stack_args -_bma_stack_capabilities -_bma_stack_diff_params -_bma_stack_diff_template -_bma_stack_name_arg -_bma_stack_params_arg -_bma_stack_template_arg -ad-app -ad-app-owners -ad-apps -ad-group-members -ad-groups -ad-user-group-diff -ad-user-groups -ad-user-names -ad-user-upns -ad-users -ad-users-graph -afd-custom-domains -afd-custom-domains-validation-request -afd-endpoints -afd-origin-groups -afd-routes -afd-waf-policies -afd-waf-policy -afd-waf-policy-rule-delete -afd-waf-policy-rule-match-condition-values -afd-waf-policy-rule-match-conditions -afd-waf-policy-rules -afds asg-capacity asg-desired-size-set asg-detach-instances @@ -64,46 +21,18 @@ aws-account-each aws-account-id aws-accounts aws-panopticon -az-account -az-cache-item -az-cache-item-delete -az-cache-items -az-user backup-jobs -bucket-acls -bucket-remove -bucket-remove-force -bucket-size -buckets -cert-chain -cert-delete -cert-ificate -cert-resource-record-valid -cert-users -cert-verify -certs -certs-arn cloudtrail-status cloudtrails -cloudwatch-alarm-actions-disable -cloudwatch-alarm-actions-enable -cloudwatch-alarm-delete -cloudwatch-alarms columnise -connector-group-apps -connector-group-members -connector-groups -connectors -debug -deployment-delete-danger +deployment deployment-groups -deployments-group +deployments distributions -domain-autorenew-disable -domain-autorenew-enable -domains ecr-repositories ecr-repository-images +elasticache-replication-groups +elasticaches elb-azs elb-dnsname elb-instances @@ -112,57 +41,18 @@ elb-subnets elb-tag elb-tags elbs +elbv2-arn elbv2-azs elbv2-dnsname elbv2-subnets elbv2-target-groups elbv2s -hosted-zone-delete -hosted-zone-ns-records -hosted-zones iam-access-key-rotate iam-role-principal iam-roles iam-users image-deregister images -instance-asg -instance-az -instance-console -instance-dns -instance-health-set-unhealthy -instance-iam-profile -instance-ip -instance-profile -instance-profile-role -instance-rdp -instance-ssh -instance-ssh-details -instance-ssm -instance-ssm-platform-type -instance-ssm-port-forward -instance-stack -instance-start -instance-state -instance-stop -instance-stop-protection -instance-stop-protection-disable -instance-stop-protection-enable -instance-subnet -instance-tag -instance-tag-create -instance-tag-delete -instance-tags -instance-tags-v2 -instance-terminate -instance-termination-protection -instance-termination-protection-disable -instance-termination-protection-enable -instance-type -instance-userdata -instance-volumes -instance-vpc -instances keypair-create keypair-delete keypairs @@ -183,109 +73,12 @@ lambda-function-memory-step lambda-functions launch-configuration-asgs launch-configurations -location -location-each -location-unset -locations +log-group-delete log-groups -management-groups -network-interfaces -nics -pcxs -private-dns-zone-a-record-add -private-dns-zone-a-record-delete -private-dns-zone-record-sets -private-dns-zones -private-endpoint-custom-dns-configs -private-endpoints rds-db-clusters rds-db-instances -region -region-each -regions -resource-diff -resource-export -resource-group -resource-group-export -resource-group-unset -resource-groups -resource-show -resourceids -resources secrets -service-principals -skim-stdin -skim-stdin-bma -skim-stdin-tsv -ssm-association-execution-targets -ssm-association-executions -ssm-associations -ssm-automation-execution -ssm-automation-execution-failures -ssm-automation-executions -ssm-automation-step-executions -ssm-instances -ssm-parameter-value -ssm-parameters -ssm-send-command -ssm-send-command-windows -stack-arn -stack-asg-instances -stack-asgs -stack-cancel-update -stack-create -stack-delete -stack-diff -stack-drift-detect -stack-drift-resources -stack-drift-status -stack-elbs -stack-events -stack-exports -stack-failure -stack-instances -stack-outputs -stack-parameters -stack-recreate -stack-resources -stack-status -stack-tag -stack-tags -stack-tags-text -stack-tail -stack-template -stack-template-changeset-latest -stack-update -stack-validate -stacks sts-assume-role -subnet-ips -subnets -subscription -subscription-each -subscription-unset -subscriptions -subscriptions-each -tag-keys -tag-split -tag-values target-group-targets target-groups -vnet-dns-resolvers -vnet-subnets -vnets -vpc-az-count -vpc-azs -vpc-default-delete -vpc-dhcp-options-ntp -vpc-endpoint-policy -vpc-endpoint-services -vpc-endpoints -vpc-igw -vpc-lambda-functions -vpc-nat-gateways -vpc-network-acls -vpc-rds -vpc-route-tables -vpc-subnets -vpcs +trim_date diff --git a/lib/autoscaling-functions b/lib/autoscaling-functions new file mode 100644 index 0000000..b98b02c --- /dev/null +++ b/lib/autoscaling-functions @@ -0,0 +1,44 @@ +#!/bin/bash +# +# autoscaling-functions +## +# show the current autoscale settings +# namespace | implemented +# ecs | yes +# elasticmapreduce | no +# ec2 | maybe +# appstream | maybe +# dynamodb | no +# rds | maybe +# sagemaker | no +# custom-resource | no +# comprehend | no +# lambda | no +# cassandra | no +# kafka | no +# elasticache | no +# neptune | no + +### this has been moved to the ecs functions. was that a good idea? +##scaling-ecs() { + # List autoscaling actions + # filter by environment (eg test1) or namespace (eg ecs) + # if you pass an argument, it'll filter for clusters whose ARN contains your text + # + # $ scaling-ecs 'test.*down' # list the scale-down times of all our test environments +# test1-ecs-admin-scale-down-overnight cron(0 0 9 ? * MON-FRI *) 0 0 +# test1-ecs-public-scale-down-overnight cron(0 0 9 ? * MON-FRI *) 0 0 +# test2-ecs-admin-scale-down-overnight cron(0 0 9 ? * MON-FRI *) 0 0 +# test2-ecs-public-scale-down-overnight cron(0 0 9 ? * MON-FRI *) 0 0 +# test3-ecs-admin-scale-down-overnight cron(0 0 9 ? * MON-FRI *) 0 0 +# test3-ecs-public-scale-down-overnight cron(0 0 9 ? * MON-FRI *) 0 0 + +## local filters=$(__bma_read_filters $@) # Filter output by arguments (optional) +## aws application-autoscaling describe-scheduled-actions \ +## --service-namespace ecs \ +## --query "ScheduledActions[].[ScheduledActionName,Schedule,ScalableTargetAction.MinCapacity,ScalableTargetAction.MaxCapacity]" \ +## --output text | +## grep -E -- "$filters" | +## LC_ALL=C sort -b -k 2| +## columnise +##} diff --git a/lib/codedeploy-functions b/lib/codedeploy-functions new file mode 100644 index 0000000..4075981 --- /dev/null +++ b/lib/codedeploy-functions @@ -0,0 +1,64 @@ +#!/bin/bash +# shellcheck disable=SC2046 +# shellcheck disable=SC2155 +# +# codedeploy-functions + +deployment() { + + # List deployments + + local deploymentgroup_names=$(skim-stdin) + local filters=$(__bma_read_filters $@) + +# aws deploy list-applications +# aws deploy list-deployment-groups --application-name 'tenders-web-dev2' +# list-deployments (limit to last 24 hours or most recent 5??) : +# aws deploy list-deployments --deployment-group-name gc3-test2 --application-name grants-web-gc3-test2 --include-only-statuses "Succeeded" --query 'deployments[0]' +# describe-deployment : aws deploy get-deployment --deployment-id d-MLWOBA1PK +## deployment-status should return the status of the last deployment to this group +# deployment-status : aws deploy get-deployment --deployment-id d-49ASRV1VL --query 'deploymentInfo.status' + aws deploy list-deployments \ + ${asg_names/#/'--auto-scaling-group-names '} \ + --output text \ + --query "AutoScalingGroups[].[ + AutoScalingGroupName, + join(',', [Tags[?Key=='Name'].Value || 'NO_NAME'][]), + CreatedTime, + join(',' sort(AvailabilityZones)) + ]" | + grep -E -- "$filters" | + sort -k 3 | + column -s$'\t' -t +} + + +deployments() { + + # List all deployment IDs for a deployment group (not useful for the user, only internal) + ## ?? if no deployment group, could we list all deployments for this application, with their groups and statuses? + local application_name=$(skim-stdin "$@") + local deployment_group_name=$(skim-stdin "$@") + [[ -z $application_name ]] && __bma_usage "application_name [application_name]" && return 1 + + # shellcheck disable=SC2086 + aws deploy list-deployments \ + --application-name $application_name \ + --deployment-group-name $deployment_group_name \ + --output text \ + column -s$'\t' -t +} + +deployment-groups() { + + # List all deployment groups for an application + + local application_name=$(skim-stdin "$@") + [[ -z $application_name ]] && __bma_usage "application_name [application_name]" && return 1 + + # shellcheck disable=SC2086 + aws deploy list-deployment-groups \ + --application-name $application_name \ + --output text \ + --query "deploymentGroups[*]" +} diff --git a/lib/ecr-functions b/lib/ecr-functions index e5db48c..6abc3ce 100644 --- a/lib/ecr-functions +++ b/lib/ecr-functions @@ -10,7 +10,6 @@ ecr-repositories() { local filters=$(__bma_read_filters $@) aws ecr describe-repositories \ - ${aws_account_id/#/'--registry-id '} \ --query " repositories[].[ repositoryName, @@ -34,6 +33,7 @@ ecr-repository-images() { local repository_names=$(skim-stdin "$@") # XXX Display USAGE if no repository_names passed in + [[ -z ${repository_names} ]] && __bma_usage "ecr" && return 1 local repository_name for repository_name in $repository_names; do diff --git a/lib/ecs-functions b/lib/ecs-functions new file mode 100644 index 0000000..85ccf47 --- /dev/null +++ b/lib/ecs-functions @@ -0,0 +1,192 @@ +#!/bin/bash +# +# ecs-functions +## +# Shortcut the complicated dependencies between clusters, services, and tasks in the ecs cli +# this is against the normal way bash-my-aws works +# it should be +# ecs-tasks [cluster-name] +# ecs-services [cluster-name] +# but then i don't know how to filter on the task/service name + +ecs-clusters() { + # List ECS clusters + # output includes clusterName,status,activeServicesCount,runningTasksCount,pendingTasksCount + # if you pass an argument, it'll filter for clusters whose ARN contains your text + # + # $ ecs-clusters test + # test-octopus-ecs-cluster ACTIVE 1 1 0 + # test1-ecs-cluster ACTIVE 3 1 0 + # test3-ecs-cluster ACTIVE 3 1 0 + # test2-ecs-cluster ACTIVE 3 3 0 + + local cluster=$(__bma_read_filters $@) # Filter output by arguments (optional) +# echo "cluster=$cluster" + aws ecs describe-clusters \ + --clusters $(aws ecs list-clusters --query "clusterArns[?contains(@, \`${cluster}\`) == \`true\`]" --output text) \ + --query "clusters[].[clusterName,status,activeServicesCount,runningTasksCount,pendingTasksCount]" \ + --output text | + LC_ALL=C sort -b -k 2| + columnise +} + +ecs-services() { + + # List ECS services + # output includes serviceName,status,desiredCount,runningCount,pendingCount,createdAt + # + # gets all clusters if no filter passed in + # if you do pass a filter: + # 1. if your filter is the name of one of your clusters, it will list the services in that cluster (eg ecs-clusters test1 | ecs-services) + # 2. if your filter is not a cluster name, it will list the services in all clusters whose names match your filter (ie it filters on cluster name not service name) + # 3. if you do not pass a filter, it will list all services in all clusters + # + # $ ecs-clusters test1|ecs-services + # test1-ecs-admin-7URaUr0YGJHi ACTIVE 0 0 0 2023-09-13T17:16:48.198000+10:00 + # test1-ecs-public-wEaTAqGXqbpq ACTIVE 0 0 0 2023-09-13T16:54:54.162000+10:00 + # test1-ecs-hangfire-YNIo1hlx8rjn ACTIVE 1 1 0 2023-09-13T16:39:06.218000+10:00 + + local filter=$(skim-stdin "$@") + echo "searching with $filter" + local cluster_names=$filter +# check for input that isn't a valid cluster name and use it as a regex... + if [[ -z "$cluster_names" || "$(aws ecs describe-clusters --clusters $cluster_names --query "failures[].reason" --output text)" == "MISSING" ]]; then + echo "cluster not found, using input to search" + cluster_names=$(ecs-clusters $cluster_names |skim-stdin) + if [[ -z "$cluster_names" ]]; then + echo "no matching cluster, using input as a service filter" + cluster_names=$(ecs-clusters |skim-stdin) + service_filter=$filter + fi + fi + + +### wait that wasn't right. +## if $filter is empty just get all the clusters +## if $filter is not empty, loop through $filter to check for valid complete cluster names +## if there is one, skip the rest +## search for cluster names containing $filter +# if [[ -z "$cluster_names" ]]; then +# echo "no matching cluster, passing all clusters to search" +# cluster_names=$(ecs-clusters |skim-stdin) +# ## here we should loop through the $filter checking that each element is a cluster?, in case the ecs-clusters command returned more than one + ##for cluster_name in $(echo $cluster_names); do # other scripts don't need this echo?? +# elif [[ "$(aws ecs describe-clusters --clusters $cluster_names --query "failures[].reason" --output text)" == "MISSING" ]]; then +# echo "cluster not found, using input to search" +# cluster_names=$(ecs-clusters $cluster_names |skim-stdin) +# service_filter=$filter +# fi +# echo "cluster_names=$cluster_names" +# echo "cluster_names=$cluster_names" + + local cluster_name + for cluster_name in $(echo $cluster_names); do # other scripts don't need this echo?? +# echo "cluster_name=$cluster_name" + aws ecs list-services \ + --cluster "$cluster_name" \ + --query " + serviceArns[?contains(@, \`${service_filter}\`) == \`true\`] + " \ + --output text | + xargs -d '\t' -I {} echo {} | + sed 's/.*\///' | + xargs -I {} \ + aws ecs describe-services \ + --cluster $cluster_name \ + --services {} \ + --query " + services[].[ + serviceName,status,desiredCount,runningCount,pendingCount,createdAt + ]" \ + --output text | + columnise +# --query "services[].[serviceName,status,desiredCount,runningCount,pendingCount,taskDefinition,createdAt,deployments[0].createdAt]" \ + done +} + +ecs-tasks() { + + # List ECS tasks + # output includes taskDefinitionArn, createdAt, cpu, memory + # + # gets all tasks if no filter passed in + # if you do pass a filter, it filters on the task name. All clusters are included (I haven't worked out a way of passing a cluster name AND a filter) + # + # $ ecs-tasks test2 + # arn:aws:ecs:ap-southeast-2:xxxxxxxxxxxx:task-definition/test2-public:18 2023-09-19T17:51:56.418000+10:00 2048 4096 + # arn:aws:ecs:ap-southeast-2:xxxxxxxxxxxx:task-definition/test2-admin:20 2023-08-29T10:03:36.956000+10:00 2048 4096 + # arn:aws:ecs:ap-southeast-2:xxxxxxxxxxxx:task-definition/test2-hangfire:22 2023-09-19T17:11:06.622000+10:00 1024 2048 + + local filter=$(skim-stdin "$@") + + for cluster_name in $(ecs-clusters |skim-stdin); do + #echo "cluster_name=$cluster_name" + # TODO: remove the account bit from the task definition, ie print gc3-test1-public:27 instead of arn:aws:ecs:ap-southeast-2:167642850091:task-definition/gc3-test1-public:27 + aws ecs describe-tasks \ + --cluster $cluster_name \ + --query " + tasks[?contains(taskDefinitionArn, \`$filter\`) == \`true\`] + .[taskDefinitionArn, lastStatus, createdAt, cpu, memory, containers[].networkInterfaces[].privateIpv4Address] + " \ + --tasks $( \ + aws ecs list-tasks \ + --cluster $cluster_name \ + --output text | + sed 's/.*\///' \ + ) \ + --output text | + sed 's/arn.*task-definition\///g' | + columnise + done + +# --query 'tasks[].{createdAt: createdAt,startedAt: startedAt,cpu: cpu,memory: memory,taskDefinitionArn: taskDefinitionArn,ephemeralStorage: ephemeralStorage.sizeInGiB,privateIpv4Address: containers[0].networkInterfaces[0].privateIpv4Address}' \ +} + +ecs-scaling-activities() { + + # List autoscaling activities - the actual scaling events that have happened + # eg + # ecs-scaling www + # 2023-11-22T06:24:50.937000+11:00 www-ecs-public-ServicePublic-OuN3rXBLvmx3-AlarmLow-64de4512-d901-4b26-a6a2-184bb1e90bc6 in state ALARM triggered policy www-ecs-public-target-tracking-mem70 Successfully set desired count to 2. Change successfully fulfilled by ecs. + # 2023-11-22T05:25:48.611000+11:00 www-ecs-public-ServicePublic-OuN3rXBLvmx3-AlarmHigh-6408c172-647e-4c0e-aac9-a800cd83317d in state ALARM triggered policy www-ecs-public-target-tracking-mem70 Successfully set desired count to 3. Change successfully fulfilled by ecs. + + # TODO : the list can be very long, add max-items or even better implement generic paging for BMA + local filter=$(skim-stdin "$@") + +aws application-autoscaling describe-scaling-activities \ + --service-namespace ecs \ + --query " + ScalingActivities[].[StartTime, Description, Cause] + " \ + --output text | + # --resource-id # add cluster and service name for better filtering + grep -E -- "$filters" | + sed 's/monitor alarm TargetTracking-service\/.*\///' | + trim_date | + columnise + +} + + +ecs-scaling-actions() { + # List autoscaling actions - cron-based scheduled scaling + # filter by environment (eg test1) or namespace (eg ecs) + # if you pass an argument, it'll filter for clusters whose ARN contains your text + # + # $ scaling-ecs 'test.*down' # list the scale-down times of all our test environments +# test1-ecs-admin-scale-down-overnight cron(0 0 9 ? * MON-FRI *) 0 0 +# test1-ecs-public-scale-down-overnight cron(0 0 9 ? * MON-FRI *) 0 0 +# test2-ecs-admin-scale-down-overnight cron(0 0 9 ? * MON-FRI *) 0 0 +# test2-ecs-public-scale-down-overnight cron(0 0 9 ? * MON-FRI *) 0 0 +# test3-ecs-admin-scale-down-overnight cron(0 0 9 ? * MON-FRI *) 0 0 +# test3-ecs-public-scale-down-overnight cron(0 0 9 ? * MON-FRI *) 0 0 + + local filters=$(__bma_read_filters $@) # Filter output by arguments (optional) + aws application-autoscaling describe-scheduled-actions \ + --service-namespace ecs \ + --query "ScheduledActions[].[ScheduledActionName,Schedule,ScalableTargetAction.MinCapacity,ScalableTargetAction.MaxCapacity]" \ + --output text | + grep -E -- "$filters" | + LC_ALL=C sort -k 1 | + columnise +} diff --git a/lib/elasticache-functions b/lib/elasticache-functions new file mode 100644 index 0000000..ca0b1b8 --- /dev/null +++ b/lib/elasticache-functions @@ -0,0 +1,56 @@ +#!/bin/bash +# +# elasticache-functions +# +# + + +elasticaches() { + + # List elasticache thingies (code borrowed from target-groups) + # + # $ target-groups + # bash-my-aws-nlb-tg TCP 22 vpc-04636ebe5573f6f65 instance bash-my-aws-nlb + # bash-my-aws-alb-tg HTTP 443 vpc-04636ebe5573f6f65 instance bash-my-aws-alb + + local cache_names=$(skim-stdin) + local filters=$(__bma_read_filters $@) + + aws elasticache describe-cache-clusters \ + --output text \ + --query " + CacheClusters[][ + CacheClusterId, + CacheNodeType, + Engine, + EngineVersion, + CacheClusterStatus + ]" | + grep -E -- "$filters" | + LC_ALL=C sort -b | + column -s$'\t' -t +} + + +elasticache-replication-groups() { + + # + # Accepts a string to filter on + # This is not very useful without column headings. + # Most of the things you want to know about a replication group are boolean + # eg AutomaticFailover, MultiAZClusterEnabled, AtRestEncryptionEnabled etc + + local ec_names=$(skim-stdin "$@") + + for ec_name in $ec_names; do +# echo "ec_name=$ec_name" + aws elasticache describe-replication-groups \ + --output text \ + --query " + ReplicationGroups + [?contains(ReplicationGroupId, \`$ec_name\`) == \`true\`] + .[ReplicationGroupId,Status, CacheNodeType] + " + done | column -s$'\t' -t +} +# how to get ReplicationGroupId etc?? \ No newline at end of file diff --git a/lib/elasticache-functions-littlelaptop b/lib/elasticache-functions-littlelaptop new file mode 100644 index 0000000..5d75ac1 --- /dev/null +++ b/lib/elasticache-functions-littlelaptop @@ -0,0 +1,57 @@ +#!/bin/bash +# +# elasticache-functions +# +# + + +elasticaches() { + + # List elasticache thingies + # + # $ target-groups + # bash-my-aws-nlb-tg TCP 22 vpc-04636ebe5573f6f65 instance bash-my-aws-nlb + # bash-my-aws-alb-tg HTTP 443 vpc-04636ebe5573f6f65 instance bash-my-aws-alb + + local cache_names=$(skim-stdin) + local filters=$(__bma_read_filters $@) + + aws elasticache describe-cache-clusters \ + ${cache_names/#/'--cache-cluster-id '} \ + --output text \ + --query " + CacheClusters[][ + CacheClusterId, + CacheNodeType, + Engine, + EngineVersion, + CacheClusterStatus + ]" | + grep -E -- "$filters" | + LC_ALL=C sort -b | + column -s$'\t' -t +} + + +elasticache-replication-groups() { + + # + # Accepts Target Group names on stdin or as arguments + # + # $ target-group-targets bash-my-aws-nlb-tg + # i-4e15ece1de1a3f869 443 healthy bash-my-aws-nlb-tg + # i-89cefa9403373d7a5 443 unhealthy bash-my-aws-nlb-tg + + local ec_names=$(skim-stdin "$@") + + for ec_name in $ec_names; do + local tg_arn=$(aws describe-replication-groups \ + --names "$ec_name" \ + --output text \ + --query " + ReplicationGroups[][ + ReplicationGroupId + ] + ") + done | column -s$'\t' -t +} diff --git a/lib/elbv2-functions b/lib/elbv2-functions index ccb5d73..bf527fd 100644 --- a/lib/elbv2-functions +++ b/lib/elbv2-functions @@ -32,6 +32,29 @@ elbv2s() { columnise } +elbv2-arn(){ + + # List DNS Names of elbv2(s) + # + # USAGE: elbv2-dnsname load-balancer [load-balancer] + # + # $ elbv2s | elbv2-dnsname + # bash-my-aws bash-my-aws-c23c598688520e51.elb.ap-southeast-2.amazonaws.com + # bash-my-aws-alb bash-my-aws-alb-2036199590.ap-southeast-2.elb.amazonaws.com + + local elbv2_names=$(skim-stdin "$@") + [[ -z "${elbv2_names}" ]] && __bma_usage "load-balancer [load-balancer]" && return 1 + + aws elbv2 describe-load-balancers \ + --names $elbv2_names \ + --output text \ + --query " + LoadBalancers[][ + LoadBalancerArn + ]" | + columnise +} + elbv2-dnsname(){ # List DNS Names of elbv2(s) diff --git a/lib/instance-functions b/lib/instance-functions index 1fa782a..98bd68a 100644 --- a/lib/instance-functions +++ b/lib/instance-functions @@ -22,6 +22,8 @@ instances() { local instances=$(skim-stdin) local filters=$(__bma_read_filters $@) + local sort_key=5 + [ -z $filters ] && sort_key=6 aws ec2 describe-instances \ ${instances/#/'--instance-ids '} \ @@ -34,14 +36,26 @@ instances() { State.Name, [Tags[?Key=='Name'].Value][0][0], LaunchTime, - Placement.AvailabilityZone, - VpcId + Placement.AvailabilityZone ]" | grep -E -- "$filters" | LC_ALL=C sort -t$'\t' -k 6 | columnise } + +instance-id() { + + # Just return the instance ID of whatever was passed in (so you can run a for loop, for instance) + # + # USAGE: instances [grep] | instance-id + + local instance_ids=$(skim-stdin "$@") + [[ -z $instance_ids ]] && __bma_usage "instance-id [instance-id]" && return 1 + echo $instance_ids | + column -s$'\t' -t +} + instance-asg() { # List autoscaling group membership of EC2 Instance(s) @@ -85,6 +99,7 @@ instance-az() { Reservations[].Instances[][ [ InstanceId, + VpcId, Placement.AvailabilityZone ] ][]" | @@ -655,7 +670,7 @@ instance-tag-create() { aws ec2 create-tags \ --resources $instances \ - --tags "Key=$key,Value=$value" + --tags "Key=$key,Value=$value" } instance-tag-delete() { @@ -671,7 +686,7 @@ instance-tag-delete() { aws ec2 delete-tags \ --resources $instances \ - --tags "Key=$key" + --tags "Key=$key" } instance-terminate() { diff --git a/lib/instance-functions~ b/lib/instance-functions~ new file mode 100644 index 0000000..40bbc74 --- /dev/null +++ b/lib/instance-functions~ @@ -0,0 +1,734 @@ +#!/bin/bash +# +# instance-functions +# +# List, run, start, stop and ssh to Amazon AWS EC2 instances + +instances() { + + # List EC2 Instances + # + # $ instances + # i-4e15ece1de1a3f869 ami-123456789012 t3.nano running nagios 2019-12-10T08:17:18.000Z ap-southeast-2a None + # i-89cefa9403373d7a5 ami-123456789012 t3.nano running postgres1 2019-12-10T08:17:20.000Z ap-southeast-2a None + # i-806d8f1592e2a2efd ami-123456789012 t3.nano running postgres2 2019-12-10T08:17:22.000Z ap-southeast-2a None + # i-61e86ac6be1e2c193 ami-123456789012 t3.nano running prometheus-web 2019-12-10T08:17:24.000Z ap-southeast-2a None + # + # *Optionally provide a filter string for a `| grep` effect with tighter columisation:* + # + # $ instances postgres + # i-89cefa9403373d7a5 ami-123456789012 t3.nano running postgres1 2019-12-10T08:17:20.000Z ap-southeast-2a None + # i-806d8f1592e2a2efd ami-123456789012 t3.nano running postgres2 2019-12-10T08:17:22.000Z ap-southeast-2a None + + local instance_ids=$(skim-stdin) + local filters=$(__bma_read_filters $@) + local sort_key=5 + [ -z $filters ] && sort_key=6 + + aws ec2 describe-instances \ + ${instance_ids/#/'--instance-ids '} \ + --output text \ + --query " + Reservations[].Instances[][ + InstanceId, + ImageId, + InstanceType, + State.Name, + [Tags[?Key=='Name'].Value][0][0], + LaunchTime, + Placement.AvailabilityZone + ]" | + grep -E -- "$filters" | + LC_ALL=C sort -b -k $sort_key | + column -s$'\t' -t +} + + +instance-id() { + + # List autoscaling group membership of EC2 Instance(s) + # + # USAGE: instance-asg instance-id [instance-id] + + local instance_ids=$(skim-stdin "$@") + [[ -z $instance_ids ]] && __bma_usage "instance-id [instance-id]" && return 1 + echo $instance_ids | + column -s$'\t' -t +} + +instance-asg() { + + # List autoscaling group membership of EC2 Instance(s) + # + # USAGE: instance-asg instance-id [instance-id] + + local instance_ids=$(skim-stdin "$@") + [[ -z $instance_ids ]] && __bma_usage "instance-id [instance-id]" && return 1 + + aws ec2 describe-instances \ + --instance-ids $instance_ids \ + --output text \ + --query " + Reservations[].Instances[][ + { + "AutoscalingGroupName": + [Tags[?Key=='aws:autoscaling:groupName'].Value][0][0], + "InstanceId": InstanceId + } + ][]" | + column -s$'\t' -t +} + + +instance-az() { + + # List availability zone of EC2 Instance(s) + # + # USAGE: instance-az instance-id [instance-id] + # + # $ instances postgres | instance-az + # i-89cefa9403373d7a5 ap-southeast-2a + # i-806d8f1592e2a2efd ap-southeast-2a + + local instance_ids=$(skim-stdin "$@") + [[ -z $instance_ids ]] && __bma_usage "instance-id [instance-id]" && return 1 + + aws ec2 describe-instances \ + --instance-ids $instance_ids \ + --output text \ + --query " + Reservations[].Instances[][ + [ + InstanceId, + VpcId, + Placement.AvailabilityZone + ] + ][]" | + column -s$'\t' -t +} + + +instance-console() { + + # List console output of EC2 Instance(s) + # + # USAGE: instance-console instance-id [instance-id] + # + # $ instances postgres | instance-console + # Console output for EC2 Instance i-89cefa9403373d7a5 + # Linux version 2.6.16-xenU (builder@patchbat.amazonsa) (gcc version 4.0.1 20050727 (Red Hat 4.0.1-5)) #1 SMP Thu Oct 26 08:41:26 SAST 2006 + # BIOS-provided physical RAM map: + # Xen: 0000000000000000 - 000000006a400000 (usable) + # ...snip... + # + # Console output for EC2 Instance i-806d8f1592e2a2efd + # Linux version 2.6.16-xenU (builder@patchbat.amazonsa) (gcc version 4.0.1 20050727 (Red Hat 4.0.1-5)) #1 SMP Thu Oct 26 08:41:26 SAST 2006 + # BIOS-provided physical RAM map: + # Xen: 0000000000000000 - 000000006a400000 (usable) + # ...snip... + + local instance_ids=$(skim-stdin "$@") + [[ -z $instance_ids ]] && __bma_usage "instance-id [instance-id]" && return 1 + + local instance_id + for instance_id in $instance_ids; do + echo + echo "Console output for EC2 Instance $instance_id" + aws ec2 get-console-output \ + --instance-id "$instance_id" \ + --output text \ + --query Output + done +} + + +instance-dns() { + + # List DNS name of EC2 Instance(s) + # + # USAGE: instance-dns instance-id [instance-id] + # + # $ instances postgres | instance-dns + # i-89cefa9403373d7a5 ip-10-155-35-61.ap-southeast-2.compute.internal ec2-54-214-206-114.ap-southeast-2.compute.amazonaws.com + # i-806d8f1592e2a2efd ip-10-178-243-63.ap-southeast-2.compute.internal ec2-54-214-244-90.ap-southeast-2.compute.amazonaws.com + + local instance_ids=$(skim-stdin "$@") + [[ -z $instance_ids ]] && __bma_usage "instance-id [instance-id]" && return 1 + + aws ec2 describe-instances \ + --instance-ids $instance_ids \ + --output text \ + --query " + Reservations[].Instances[][ + { + "InstanceId": InstanceId, + "Private": PrivateDnsName, + "Public": PublicDnsName + } + ][]" | + column -s$'\t' -t +} + + +instance-health-set-unhealthy() { + + # Mark EC2 Instance(s) as unhealthy (to trigger replacement by ASG) + # + # USAGE: instance-health-set-unhealthy instance-id [instance-id] + + local instance_ids=$(skim-stdin "$@") + [[ -z $instance_ids ]] && __bma_usage "instance-id [instance-id]" && return 1 + + local health_status=Unhealthy + + local instance + for instance_id in $instance_ids; do + aws autoscaling set-instance-health \ + --instance-id "$instance_id" \ + --health-status "$health_status" + done +} + + +instance-iam-profile() { + + # List iam-profile of EC2 Instance(s) + # + # USAGE: instance-iam-profile instance-id [instance-id] + + local instance_ids=$(skim-stdin "$@") + [[ -z $instance_ids ]] && __bma_usage "instance-id [instance-id]" && return 1 + + aws ec2 describe-instances \ + --instance-ids $instance_ids \ + --output text \ + --query " + Reservations[].Instances[][ + [ + InstanceId, + IamInstanceProfile.Id + ] + ][]" | + column -s$'\t' -t +} + + +instance-ip() { + + # List ip address of EC2 Instance(s) + # + # USAGE: instance-ip instance-id [instance-id] + # + # $ instances postgres | instance-ip + # i-89cefa9403373d7a5 10.155.35.61 54.214.206.114 + # i-806d8f1592e2a2efd 10.178.243.63 54.214.244.90 + + local instance_ids=$(skim-stdin "$@") + [[ -z $instance_ids ]] && __bma_usage "instance-id [instance-id]" && return 1 + + aws ec2 describe-instances \ + --instance-ids $instance_ids \ + --output text \ + --query " + Reservations[].Instances[][ + { + "InstanceId": InstanceId, + "Private": PrivateIpAddress, + "Public": PublicIpAddress + } + ][]" | + column -s$'\t' -t +} + + +instance-ssh() { + + # Establish SSH connection to EC2 Instance(s) + # + # USAGE: instance-ssh [login] [instance-id] [instance-id] + + if [[ $1 != *i-* ]]; then + local user=${1} + shift + fi + local instance_ids=$(skim-stdin "$@") + if [[ -z $instance_ids ]] ; then + echo "Usage: $FUNCNAME [login] [instance-id] [instance-id]" + return 1 + fi + + exec &1 + + ssh \ + -t \ + -i "${BMA_SSH_DIR:-~/.ssh}/$keyname" \ + -o LogLevel=error \ + -o StrictHostKeyChecking=no \ + -o UserKnownHostsFile=/dev/null \ + -l "$USERNAME" \ + "$private_ip" + done +} + + +instance-ssh-details() { + + # List details needed to SSH into EC2 Instance(s) + # + # USAGE: instance-ssh-details [login] [instance-id] [instance-id] + + if [[ $1 != *i-* ]]; then + local user=${1} + shift + fi + local instance_ids=$(skim-stdin "$@") + [[ -z "${instance_ids}" ]] && __bma_usage "instance_id" && return 1 + + aws ec2 describe-instances \ + --instance-ids $instance_ids \ + --output text \ + --query " + Reservations[].Instances[][ + InstanceId, + KeyName, + (PublicIpAddress || PrivateIpAddress), + join(' ', [Tags[?Key=='Name'].Value][] || ['not-named']), + join(' ', [Tags[?Key=='default-user'].Value][] || ['']) + ]" | + column -s$'\t' -t +} + + +instance-ssm() { + + # Establish SSM connection to EC2 Instance(s) + # + # USAGE: instance-ssm instance-id [instance-id] + + local instance_ids=$(skim-stdin "$@") + if [[ -z $instance_ids ]] ; then + echo "Usage: $FUNCNAME instance-id [instance-id]" + return 1 + fi + + exec &1 + ); then stack-tail $stack + else + echo "$output" + if [[ $output == *"InsufficientCapabilitiesException"* ]] ; then + for capability in ${list_capabilities} ; do + if [[ $output == *"$capability"* ]] ; then + capabilities="${capabilities} ${capability}" + fi + done + if [[ $capabilities ]] ; then + local regex_yes="^[Yy]$" + read -p "Do you want to try again with these capabilities? " -n 1 -r + echo + [[ $REPLY =~ $regex_yes ]] || return 0 + stack-create $@ ${capabilities} + fi + fi fi + + } stack-update() { @@ -257,7 +287,11 @@ stack-update() { local capabilities='' local capabilities_value=$(_bma_stack_capabilities $stack) [[ -z "${capabilities_value}" ]] || capabilities="--capabilities ${capabilities_value}" - +echo "aws cloudformation update-stack \ + --stack-name $stack \ + --template-body file://$template \ + $parameters \ + $capabilities" if aws cloudformation update-stack \ --stack-name $stack \ --template-body file://$template \ @@ -417,10 +451,10 @@ stack-resources() { local stack for stack in $stacks; do stack=$(_bma_stack_name_arg "$stack") - aws cloudformation describe-stack-resources \ + aws cloudformation list-stack-resources \ --stack-name $(_bma_stack_name_arg "$stack") \ --output "${BMA_OUTPUT_AWS:-text}" \ - --query "StackResources[].{ + --query "StackResourceSummaries[].{ PhysicalResourceId: PhysicalResourceId, ResourceType: ResourceType, ResourceStatus: ResourceStatus, @@ -557,22 +591,22 @@ stack-tag() { # XXX Handy but dangerous - updating a nested stack breaks things. Put in a guard. # XXX # XXX stack-tag-apply() { -# XXX +# XXX # XXX # Apply a stack tag -# XXX +# XXX # XXX local tag_key=$1 # XXX local tag_value=$2 # XXX shift 2 # XXX local usage_msg="tag-key tag-value stack [stack]" # XXX [[ -z "${tag_key}" ]] && __bma_usage $usage_msg && return 1 # XXX [[ -z "${tag_value}" ]] && __bma_usage $usage_msg && return 1 -# XXX +# XXX # XXX local stacks=$(skim-stdin "$@") # XXX [[ -z "${stacks}" && -t 0 ]] && __bma_usage $usage_msg && return 1 -# XXX +# XXX # XXX local stack # XXX for stack in $stacks; do -# XXX +# XXX # XXX # XXX deal with tagging service failing # XXX local tags=$(aws cloudformation describe-stacks \ # XXX --stack-name "$stack" \ @@ -580,7 +614,7 @@ stack-tag() { # XXX [{Key:'$tag_key', Value:'$tag_value'}], # XXX Stacks[].Tags[?Key != '$tag_key'][] # XXX ][]") -# XXX +# XXX # XXX local parameters=$(aws cloudformation describe-stacks \ # XXX --stack-name "$stack" \ # XXX --query ' @@ -588,11 +622,11 @@ stack-tag() { # XXX ParameterKey: ParameterKey, # XXX UsePreviousValue: `true` # XXX }') -# XXX +# XXX # XXX local capabilities='' # XXX local capabilities_value=$(_bma_stack_capabilities $stack) # XXX [[ -z "${capabilities_value}" ]] || capabilities="--capabilities ${capabilities_value}" -# XXX +# XXX # XXX $([[ -n $DRY_RUN ]] && echo echo) aws cloudformation update-stack \ # XXX --stack-name "$stack" \ # XXX --use-previous-template \ @@ -607,26 +641,26 @@ stack-tag() { # XXX Handy but dangerous - updating a nested stack breaks things. Put in a guard. # XXX # XXX stack-tag-delete() { -# XXX +# XXX # XXX # delete a stack tag -# XXX +# XXX # XXX local tag_key=$1 # XXX shift 1 # XXX [[ -z "${tag_key}" ]] && __bma_usage "tag-key stack [stack]" && return 1 -# XXX +# XXX # XXX local stacks=$(skim-stdin "$@") # XXX [[ -z "${stacks}" ]] && __bma_usage "tag-key stack [stack]" && return 1 -# XXX +# XXX # XXX local stack # XXX for stack in $stacks; do -# XXX +# XXX # XXX # XXX deal with tagging service failing # XXX local tags=$(aws cloudformation describe-stacks \ # XXX --stack-name "$stack" \ # XXX --query "[ # XXX Stacks[].Tags[?Key != '$tag_key'][] # XXX ][]") -# XXX +# XXX # XXX local parameters=$(aws cloudformation describe-stacks \ # XXX --stack-name "$stack" \ # XXX --query ' @@ -634,13 +668,13 @@ stack-tag() { # XXX ParameterKey: ParameterKey, # XXX UsePreviousValue: `true` # XXX }') -# XXX +# XXX # XXX aws cloudformation update-stack \ # XXX --stack-name "$stack" \ # XXX --use-previous-template \ # XXX --parameters "$parameters" \ # XXX --tags "$tags" -# XXX +# XXX # XXX done # XXX } @@ -681,19 +715,20 @@ stack-tail() { stack-template() { - # Return template of a stack - - local inputs=$(skim-stdin "$@") - local stack=$(_bma_stack_name_arg ${inputs}) + # Return template of each stack + local stacks=$(skim-stdin "$@") - [[ -z ${stack} ]] && __bma_usage "stack" && return 1 + [[ -z ${stacks} ]] && __bma_usage "stack [stack]" && return 1 + local stack + for stack in $stacks; do - aws cloudformation get-template \ - --stack-name "$stack" \ - --query TemplateBody | - jq --raw-output --sort-keys . | - sed -e :a -e '/^\n*$/{$d;N;};/\n$/ba' # remove trailing blank lines + aws cloudformation get-template \ + --stack-name "$stack" \ + --query TemplateBody | + jq --raw-output --sort-keys . | + sed -e :a -e '/^\n*$/{$d;N;};/\n$/ba' # remove trailing blank lines # sometimes appended by jq + done } stack-template-changeset-latest() { @@ -791,6 +826,88 @@ stack-validate() { fi } + +stack-detect-drift() { + + # Detect drift for provided stacks; and print coloured diff + local stacks=$(skim-stdin "$@") + [[ -z ${stacks} ]] && __bma_usage "stack [stack]" && return 1 + + for stack in $stacks; do + driftDetectionId=$(aws cloudformation detect-stack-drift \ + --stack-name "$stack" --output text) + DetectionStatus="" + while [[ "$DetectionStatus" != "DETECTION_COMPLETE" ]]; do + printf "." + DescribeDriftDetectionStatus=$(aws cloudformation describe-stack-drift-detection-status \ + --stack-drift-detection-id $driftDetectionId ) + DetectionStatus=$(echo $DescribeDriftDetectionStatus | jq --raw-output .DetectionStatus ) + StackDriftStatus=$(echo $DescribeDriftDetectionStatus | jq --raw-output .StackDriftStatus) + sleep 5; + done + if [[ "$StackDriftStatus" == "IN_SYNC" ]]; then + echo + echo "$stack is in sync" + else + echo "$stack has drifted" + stack-diff-drift $stack + fi + done + +} + +stack-describe-drift() { + + # List stack-tags applied to a stack + + local inputs=$(skim-stdin "$@") + local stack=$(_bma_stack_name_arg ${inputs}) + + [[ -z ${stack} ]] && __bma_usage "stack" && return 1 + + stackResourceDrifts=$( aws cloudformation describe-stack-resource-drifts \ + --stack-name "$stack" \ + --query 'StackResourceDrifts[*].{StackId:StackId,ExpectedProperties:ExpectedProperties,ActualProperties:ActualProperties}' ) +# jq -S <<< $stackResourceDrifts + ExpectedProperties=$(echo $stackResourceDrifts | jq --raw-output .[].ExpectedProperties) +# ExpectedPropertiesPretty=$(jq . -S --raw-output <<< "$ExpectedProperties") + ActualProperties=$(echo $stackResourceDrifts | jq --raw-output .[].ActualProperties) +# ActualPropertiesPretty=$(jq . -S --raw-output <<< "$ActualProperties") + echo + echo "Expected Properties:" + jq . <<< "$ExpectedProperties" + echo "Actual Properties:" + jq . <<< "$ActualProperties" + echo + +} + +stack-diff-drift() { + + # List stack-tags applied to a stack + + local inputs=$(skim-stdin "$@") + local stack=$(_bma_stack_name_arg ${inputs}) + + [[ -z ${stack} ]] && __bma_usage "stack" && return 1 + + stackResourceDrifts=$( aws cloudformation describe-stack-resource-drifts \ + --stack-name "$stack" \ + --query 'StackResourceDrifts[*].{StackId:StackId,ExpectedProperties:ExpectedProperties,ActualProperties:ActualProperties}' ) +# jq -S <<< $stackResourceDrifts + ExpectedProperties=$(echo $stackResourceDrifts | jq --raw-output .[].ExpectedProperties) + ExpectedPropertiesPretty=$(jq . -S --raw-output <<< "$ExpectedProperties") + ActualProperties=$(echo $stackResourceDrifts | jq --raw-output .[].ActualProperties) + ActualPropertiesPretty=$(jq . -S --raw-output <<< "$ActualProperties") + echo + # TODO : check whether diff is installed, otherwise just print $ExpectedPropertiesPretty and $ActualPropertiesPretty + echo "The diff ( Expected | Actual )" + diff -y --left-column --color=always <(printf %s "$ExpectedPropertiesPretty") <(printf %s "$ActualPropertiesPretty") + +} + + + stack-diff(){ # Compare live stack against local template (and optional params file) @@ -845,7 +962,7 @@ _bma_stack_diff_template() { elif command -v icdiff; then local DIFF_CMD=icdiff else - local DIFF_CMD=diff + local DIFF_CMD='diff --color=always' fi $DIFF_CMD -u \ @@ -971,7 +1088,8 @@ _bma_stack_args(){ __bma_error "Could not find params file (${params})." else # Display calling (or current if none) with expanded arguments - echo "Resolved arguments: $stack $template $params" + # echo "Resolved arguments: $stack $template $params" + true fi }