AWS Notes
5.6K subscribers
444 photos
42 videos
10 files
2.8K links
AWS Notes — Amazon Web Services Educational and Information Channel

Chat: https://xn--r1a.website/aws_notes_chat

Contacts: @apple_rom, https://www.linkedin.com/in/roman-siewko/
Download Telegram
CodeBuild и ECS

Когда из CodeBuild нужно работать с другим аккаунтом, и потребуется переключаться в роль с помощью флажка --profile, учтите , что обычный вариант не сработает и будет давать ошибку:

Error when retrieving credentials from Ec2InstanceMetadata: No credentials found in credential_source referenced in profile ***

Это потому, что вместо обычного:

credential_source = Ec2InstanceMetadata

В секции профиля файла ~/.aws/config нужно использовать:

credential_source = EcsContainer

И всё заработает.

Почему? Получается, видимо, потому, что CodeBuild под капотом использует ECS.

В принципе, логично, хоть и не видел подобного в документации (что тоже логично).

#CodeBuild
​​aws --debug

В случае проблем не забывайте, что у AWS CLI есть стандартный ключик --debug, где можно увидеть всё, что происходит под капотом во время выполнения любой команды.

https://docs.aws.amazon.com/cli/latest/reference/index.html

Например, казалось бы, простая команда просмотра имеющихся бакетов aws s3 ls даёт на выходе огромнейший лог (см. картинку и это лишь часть).

Пользы в таком логе в общем случае нет, однако когда у вас какая-то непонятнейшая ошибка — очень может помочь.

Например, непонятно почему, команда отрабатывает не так, как вы планировали и пишет, что нет credentials или не хватает прав. Запустив с ключиком --debug, можно пронаблюдать, как команда aws перебирает источники credentials, на картинке это строчки с:

Looking for credentials via: env
Looking for credentials via: assume-role
Looking for credentials via: shared-credentials-file
Looking for credentials via: custom-process
Looking for credentials via: config-file
Looking for credentials via: ec2-credentials-file
Looking for credentials via: boto-config
Looking for credentials via: container-role
Looking for credentials via: iam-role

В результате наглядно видны приоритеты получения aws-cli credentials, что вполне может навести на мысль, почему не работает как нужно.

Итого — не забываем про ключик --debug, в проблематичных ситуациях попробовать с ним может решить проблему. А если и нет, то запостить куда-то с логами будет много показательней, чем на словах объяснять, что "не хочет работать".

#aws_cli
​​AWS СLI v.2 в Docker

Теперь не обязательно ставить aws-cli локально и всегда можно быстро попробовать с последней версией. В общем, удобная и важная возможность — запустить aws-cli в докере:

https://aws.amazon.com/blogs/developer/aws-cli-v2-docker-image/

Легко и просто работает через роль виртуалки, а чтобы прокинуть внутрь credentials или скачать/закачать какие-то файлы, то используем стандартный ключик монтирования -v:

docker run -it -v $(pwd):/aws amazon/aws-cli s3 cp 1.txt s3://my-bucket

#aws_cli
​​Пример query в aws cli с фильтрацией:

aws dynamodb query --table-name jenkins \
--key-condition-expression "Project = :jp" \
--filter-expression "#repo = :ecr" \
--expression-attribute-names '{"#repo": "Repo"}' \
--expression-attribute-values '{
":jp": { "S": "my-service" },
":ecr": { "S": "888888888888.dkr.ecr.eu-central-1.amazonaws.com/my-repo" }
}'

Как-то писал, что подобных конкретных примеров по DynamoDB мало, потому стоит порекомендовать хороший сайт по ней:

https://www.dynamodbguide.com

В частности, добавлю, что его автор, Alex DeBrie (AWS Data Hero), недавно выпустил полноценную книжку:

https://www.dynamodbbook.com/

Её шибко хвалят известные господа в данной области, так что наверняка стоит прочитать, если это ваша тема или у вас много DynamoDB в проекте.

#DynamoDB #aws_cli
Как зашифровать объекты в S3 бакете с помощью aws-cli:

https://aws.amazon.com/blogs/storage/encrypting-existing-amazon-s3-objects-with-the-aws-cli/

Простая и очевидная, но детальная и полезная статья с конкретными командами и подробностями (пере)шифрования ваших файлов на S3.

Запустить несложно, стоит недорого (т.к. лишь за запросы к API) и крайне рекомендуется для того, чтобы привести ваши старые нешифрованные запасы к современному, шифрованному по умолчанию, виду.

#s3 #encryption #aws_cli
Установка AWS CLI v.2 (на самом деле нет):

alias aws='docker run --rm -it -v ~/.aws:/root/.aws -v $(pwd):/aws amazon/aws-cli'

Всё, у нас последняя версия aws-cli.

aws --version
aws-cli/2.0.30 Python/3.7.3 Linux/4.14.158-129.185.amzn2.x86_64 botocore/2.0.0dev34

Понятно, что нужен Docker, однако обычно это сейчас чуть меньше, чем везде.

Чтобы обновить AWS CLI v.2, просто:

docker rmi amazon/aws-cli

Официальная документация:

https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-docker.html

#aws_cli
​​Версии AWS CLI

Стоит учесть, что когда пользуетесь примерами в документации, то там подразумевается использование последней на текущий момент — второй версии.

В основном она повторяет и расширяет возможности первой версии, но есть и критические отличия:

https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration.html

Одно из самых заметных — аутентификация в ECR, теперь это не aws ecr get-login, а aws ecr get-login-password:

https://docs.aws.amazon.com/AmazonECR/latest/userguide/Registries.html#registry_auth

В отличие от первой версии возвращает в stdout чисто пароль. Для старых скриптов (где доступна лишь первая версия) можно использовать следующую "замену":

aws ecr get-login --region eu-west-1 | awk '{print $6}'

В любом случае, всё новое уже лучше писать под последнюю версию aws-cli.

#aws_cli
This media is not supported in your browser
VIEW IN TELEGRAM
Впечатляющая фича в новых версиях AWS CLI — автодополнение, в том числе для JMESPath (--query).

https://github.com/aws/aws-cli/issues/5664

Очень весомый повод обязательно перейти на вторую версию aws-cli.

Подробности в документации:

https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-parameters-prompting.html

#aws_cli
​​Чем отличается вторая версия aws-cli от первой, так это включенным по умолчанию pager-ом, из-за которого приходится нажимать клавиши, чтобы увидеть весь вывод на экран, если он большой.

Чтобы исправить это раздражающее поведение в aws-cli v2, то можно добавить строчку export AWS_PAGER="" в автозагрузку:

https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-output.html#cli-usage-output-pager

#aws_cli
Получить в командной строке время создания текущего AWS аккаунта в формате мм/дд/гг:

AWS_ID=$(aws sts get-caller-identity --query Account --output text)
CREATED=$(aws organizations describe-account --account-id $AWS_ID --query Account.JoinedTimestamp --output text)
date -d $CREATED '+%D'

#aws_cli #query
В конце 2020-го в EKS появились AddOn-ы:

https://aws.amazon.com/blogs/containers/introducing-amazon-eks-add-ons/

С недавнего времени AddOn для VPC-CNI можно поставить в EKS через CloudFormation:

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-addon.html

eksAddOn:
 Type: AWS::EKS::Addon
 Properties: 
 AddonName: vpc-cni
 AddonVersion: !Ref VpcCniVersion
 ClusterName: !Ref eksCluster
 ResolveConflicts: OVERWRITE

Однако значений AddonVersion в документации на данный момент нет. Чтобы получить доступные варианты, используем describe-addon-versions:

aws eks describe-addon-versions --kubernetes-version 1.19 --addon-name vpc-cni --query addons[].addonVersions[].addonVersion[]
[
  "v1.7.9-eksbuild.1",
  "v1.7.6-eksbuild.1",
  "v1.7.5-eksbuild.1",
  "v1.6.3-eksbuild.1"
]

#CloudFormaion #EKS #aws_cli
Суровый баш для обновления сессионных токенов для AWS CLI при использовании MFA:

https://blog.ivnilv.com/tools/sacc/

#bash #aws_cli
Закрытие AWS account через AWS SDK & AWS CLI:

https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_accounts_close.html#aws-cli-&-aws-sdks

aws organizations close-account --account-id 123456789012

Не прошло и пять лет. Ан нет, прошло.

Нужно учитывать следующие особенности закрытия (на самом деле сначала приостановки - SUSPENDED) AWS аккаунтов в Organizations:

▫️ Закрыть можно любой аккаунт (member account, иногда называются как sub-account) кроме главного (management account, ранее master account).
▫️ Пока команда выполнения закрытия аккаунта находится в процессе (обычно несколько минут), аккаунт будет в состоянии PENDING_CLOSURE. По её отработке он переходит в состояние SUSPENDED, в котором будет висеть ещё три месяца, прежде, чем окончательно удалится.
▫️ Закрыть сразу все аккаунты не получится. Можно закрыть лишь 10% от общего количества в течение месяца.
▫️ Случайно закрытый нужный аккаунт можно восстановить в течение 90 дней через Support (пока аккаунт находится в состоянии SUSPENDED).

Подробности API для Organizations - CloseAccount:

https://docs.aws.amazon.com/organizations/latest/APIReference/API_CloseAccount.html

Особенности закрытия аккаунтов для AWS GovCloud (US):

https://docs.aws.amazon.com/govcloud-us/latest/UserGuide/Closing-govcloud-account.html

⚠️ На момент публикации документация на команду AWS CLI close-account пока ещё не доступна.

#Organizations
👍53🎉2
aws --debug

В случае проблем при работе с AWS CLI стоит помнить про стандартный ключик --debug, который покажет всё, что происходит под капотом во время выполнения команды aws.

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/index.html#global-options

Любая команда выдаст простыню логов, в частности, если присмотреться, то можно увидеть, как команда aws перебирает источники credentials:

Looking for credentials via: env
Looking for credentials via: assume-role
Looking for credentials via: shared-credentials-file
Looking for credentials via: custom-process
Looking for credentials via: config-file
Looking for credentials via: ec2-credentials-file
Looking for credentials via: boto-config
Looking for credentials via: container-role
Looking for credentials via: iam-role

В результате наглядно видны приоритеты получения aws-cli credentials, что вполне может навести на мысль, почему не работает как нужно.

Если же думать и присматриваться лень, то скормив эту простыню ChatGPT, можно рассчитывать на максимально точные рекомендации.

#aws_cli
👍11😁1🤔1
Начиная с версии AWS CLI v2.30.3 можно генерить/обновлять креды для IAM юзеров с MFA без сторонних утилит с помощью команды:

aws configure mfa-login

Для удобства лучше сразу добавить имя генерируемого профиля с помощью --update-profile , иначе сгенерит автоматически, а также --duration-seconds , максимум на 36 часов и ARN устройства --serial-number, чтобы не вводить отдельно:

# aws --profile=aws-notes-s3-user configure mfa-login --update-profile=mfa-aws-notes-s3-user --duration-seconds=129600 --serial-number=arn:aws:iam::984475386489:mfa/My-iPhone

MFA token code: 969969
Temporary credentials written to profile 'mfa-aws-notes-s3-user'
Credentials will expire at 2025-09-18T19:50:40+00:00
To use these credentials, specify --profile mfa-
aws-notes-s3-user when running AWS CLI commands


# aws --profile mfa-aws-notes-s3-user s3 ls

2018-11-18 16:17:32 aws-notes-test


p.s. IAM юзеры зло — используйте SSO (IAM Identity Center).

#aws_cli
👍14💯2