Least Outstanding Requests (LOR) балансировка для ALB
При распределении запросов за ALB используется обычный Round-Robin. Теперь же можно задать Least Outstanding Requests (LOR) - маршрутизировать запросы сначала к тем, кто лучше пингуется:
https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-target-groups.html#modify-routing-algorithm
То есть запросы будут получать инстансы с учётом значений RequestCount, TargetConnectionErrorCount и TargetResponseTime.
Не на всех типах нагрузки это отразится, однако денег лишних не просит, а первые результаты очень положительные (см. картинку), потому точно стоит попробовать.
Включается в консоли в Target Groups или с помощью #aws_cli:
https://docs.aws.amazon.com/cli/latest/reference/elbv2/modify-target-group-attributes.html
Удачных экспериментов!
#ALB
При распределении запросов за ALB используется обычный Round-Robin. Теперь же можно задать Least Outstanding Requests (LOR) - маршрутизировать запросы сначала к тем, кто лучше пингуется:
https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-target-groups.html#modify-routing-algorithm
То есть запросы будут получать инстансы с учётом значений RequestCount, TargetConnectionErrorCount и TargetResponseTime.
Не на всех типах нагрузки это отразится, однако денег лишних не просит, а первые результаты очень положительные (см. картинку), потому точно стоит попробовать.
Включается в консоли в Target Groups или с помощью #aws_cli:
https://docs.aws.amazon.com/cli/latest/reference/elbv2/modify-target-group-attributes.html
Удачных экспериментов!
#ALB
S3 Access Points - первый взгляд
Недавно появившиеся S3 Access Points стали попыткой начать избавляться от наследия S3 с её требованием к глобальной уникальности имени бакета (т.е. когда имя приходится каждый раз придумывать новое по каким-то паттернам, т.к. иначе получаем ошибку создания бакета).
Теперь же можно создавать и использовать условные "ссылки на бакет" - S3 Access Points. Такие ссылки имеют имя (например,
Технически попробовать просто - в S3 консоли переходите на вкладку S3 Access Points и создаёте endpoint с каким-то именем. Добавляете к нему #bucket_policy, как к обычному бакету, только в качестве ресурса нужно будет указать arn в виде (он указан на странице вашего Access Point):
"Resource": "arn:aws:s3:
Этот ресурс есть "ссылка на бакет" и к нему можно применять обычные команды #aws_cli (лишь с поправкой, что её придётся для этого обновить, иначе будет ругаться на имя бакета "Bucket name must match..."). Например, можно сделать привычный листинг
Однако в случае cross-account доступа крайне неудобно, т.к. приходится прописывать политики и на самом бакете и на каждой "ссылке" (Access Point). И #CRR (Cross-Region Replication) не работает для S3 Access Points.
И набор других особенностей и ограничений. Так что пока сырое, нужно учитывать данный момент.
Предположительный сценарий использования S3 Access Points - вы обрабатываете данные из одного (общего для всех, единственного) бакета, раздавая ссылки на него со своими политиками для каждого из окружений. Можно также как-то задействовать в Blue-Green сценариях и ещё какие-то специцифичные случаи.
В общем S3AP пополнили длинный список фич Амазона под названием "придумай зачем". Однако это шаг в правильном направлении и будучи допиленным, наверняка станет best practices, т.к. даёт дополнительную абстракцию, позволяя гибко управлять и избавляя от некоторых legacy ограничений.
#S3 #S3AP
Недавно появившиеся S3 Access Points стали попыткой начать избавляться от наследия S3 с её требованием к глобальной уникальности имени бакета (т.е. когда имя приходится каждый раз придумывать новое по каким-то паттернам, т.к. иначе получаем ошибку создания бакета).
Теперь же можно создавать и использовать условные "ссылки на бакет" - S3 Access Points. Такие ссылки имеют имя (например,
ext из примера), которое должно быть уникальным лишь в конкретном регионе и аккаунте. Что может быть удобным при использовании в мульти-аккаунт схеме, где одно приложение в одном аккаунте, значит можно спокойно использовать одинаковые имена (ссылки на бакет).Технически попробовать просто - в S3 консоли переходите на вкладку S3 Access Points и создаёте endpoint с каким-то именем. Добавляете к нему #bucket_policy, как к обычному бакету, только в качестве ресурса нужно будет указать arn в виде (он указан на странице вашего Access Point):
"Resource": "arn:aws:s3:
eu-west-1:896118698909:accesspoint/ext"Этот ресурс есть "ссылка на бакет" и к нему можно применять обычные команды #aws_cli (лишь с поправкой, что её придётся для этого обновить, иначе будет ругаться на имя бакета "Bucket name must match..."). Например, можно сделать привычный листинг
aws s3 ls arn_ссылки_на_бакет (на картинке). Однако в случае cross-account доступа крайне неудобно, т.к. приходится прописывать политики и на самом бакете и на каждой "ссылке" (Access Point). И #CRR (Cross-Region Replication) не работает для S3 Access Points.
И набор других особенностей и ограничений. Так что пока сырое, нужно учитывать данный момент.
Предположительный сценарий использования S3 Access Points - вы обрабатываете данные из одного (общего для всех, единственного) бакета, раздавая ссылки на него со своими политиками для каждого из окружений. Можно также как-то задействовать в Blue-Green сценариях и ещё какие-то специцифичные случаи.
В общем S3AP пополнили длинный список фич Амазона под названием "придумай зачем". Однако это шаг в правильном направлении и будучи допиленным, наверняка станет best practices, т.к. даёт дополнительную абстракцию, позволяя гибко управлять и избавляя от некоторых legacy ограничений.
#S3 #S3AP
Отличный практикум по Лямбде из командной строки:
https://github.com/nsriram/lambda-the-cli-way
Поэтапное усложнение - от HelloWorld и логов, до интеграции с другими сервисами и SAM (Serverless Application Model). В закладки однозначно.
#Lambda #aws_cli #tutorial
https://github.com/nsriram/lambda-the-cli-way
Поэтапное усложнение - от HelloWorld и логов, до интеграции с другими сервисами и SAM (Serverless Application Model). В закладки однозначно.
#Lambda #aws_cli #tutorial
GitHub
GitHub - nsriram/lambda-the-cli-way: AWS Lambda using CLI, an introductory cookbook
AWS Lambda using CLI, an introductory cookbook. Contribute to nsriram/lambda-the-cli-way development by creating an account on GitHub.
Работа с DynamoDB из aws-cli
Примеров работы из aws-cli с DynamoDB кот наплакал, особенно, когда нужны простые вещи, но выходящие за рамки примеров из документации.
create-table
Создадим простенькую таблицу для условного Jenkins, куда будем писать для каждого проекта (
Здесь и дальше предполагается, что настроен
aws dynamodb create-table \
put-item
Запишем в таблицу значение для условного проекта
date +%s
Получение
Сделаем выполнение сразу из строки, а не через отдельный файл для JSON (из-за этого не получится разбить строчку обратным слэшем - поэтому получится длинная):
aws dynamodb put-item --table-name jenkins --item
Переменных добавлено сразу много разных и больше условно, чисто для примера и чтобы удобней выбрать, удалив лишние.
update-item
Обновим билд
aws dynamodb update-item --table-name jenkins --key
...продолжение следует
#DynamoDB #aws_cli
Примеров работы из aws-cli с DynamoDB кот наплакал, особенно, когда нужны простые вещи, но выходящие за рамки примеров из документации.
create-table
Создадим простенькую таблицу для условного Jenkins, куда будем писать для каждого проекта (
jenkinsProject) свои переменные для каждого билда (buildNumber). Для уменьшения стоимости (хоть и так будет около нуля) вместо дефолтного режима (PROVISIONED) сразу включим (PAY_PER_REQUEST).Здесь и дальше предполагается, что настроен
~/.aws/config , иначе к каждому запросу добавляем регион --region eu-west-1 (и/или --profile my-profile)aws dynamodb create-table \
--table-name jenkins \
--attribute-definitions \
AttributeName=jenkinsProject,AttributeType=S \
AttributeName=buildNumber,AttributeType=N \
--key-schema \
AttributeName=jenkinsProject,KeyType=HASH \
AttributeName=buildNumber,KeyType=RANGE \
--billing-mode PAY_PER_REQUEST
put-item
Запишем в таблицу значение для условного проекта
aws-notes и билда номер 1 из ветки feature-1. Для получения текущего timestamp вручную выполним:date +%s
1578575096 Получение
timestamp можно добавить и сразу в команду, но так наглядней.Сделаем выполнение сразу из строки, а не через отдельный файл для JSON (из-за этого не получится разбить строчку обратным слэшем - поэтому получится длинная):
aws dynamodb put-item --table-name jenkins --item
'{ "jenkinsProject": {"S": "aws-notes"}, "buildNumber": {"N": "1"}, "imageTag": {"S": "feature-1.build-1"}, "imageRepository": {"S": "123166313456.dkr.ecr.eu-west-1.amazonaws.com/aws-notes"}, "date": {"S": "2020-01-09 13:04"}, "timestamp": {"N": "1569486943"}, "branch": {"S": "feature-1"} }'Переменных добавлено сразу много разных и больше условно, чисто для примера и чтобы удобней выбрать, удалив лишние.
update-item
Обновим билд
1, исправив в нём тэг и ветку (заменим 1 на 1а):aws dynamodb update-item --table-name jenkins --key
'{ "jenkinsProject": {"S": "aws-notes"}, "buildNumber": {"N": "1"} }' --update-expression "SET #T = :t, #B = :b" --expression-attribute-names '{ "#T":"imageTag", "#B":"branch" }' --expression-attribute-values '{ ":t": {"S": "feature-1a.build-1"}, ":b": {"S": "feature-1a"} }'...продолжение следует
#DynamoDB #aws_cli
Работа с DynamoDB из aws-cli
scan
Предположим, в таблице много билдов разных проектов. Получим все записи таблицы с ограничением максимум 100 значений.
aws dynamodb scan --table-name jenkins
Это будут все проекты, можно вывести лишь нужный, например,
aws dynamodb scan --table-name jenkins --query
query
Сделать выборку по проекту
aws dynamodb query --table-name jenkins --max-items 100 --key-condition-expression
Как найти последнее значение билда (не обязательно совпадающее с количеством записей)? Для этого сделаем реверсивную выборку и получим последний элемент, выделив его с помощью #query и сделав таблицу:
aws dynamodb query --table-name jenkins --key-condition-expression
delete-item
Удалим билд
aws dynamodb delete-item --table-name jenkins --key
delete-table
Удалим таблицу .
aws dynamodb delete-table --table-name jenkins
#DynamoDB #aws_cli
scan
Предположим, в таблице много билдов разных проектов. Получим все записи таблицы с ограничением максимум 100 значений.
aws dynamodb scan --table-name jenkins
--max-items 100Это будут все проекты, можно вывести лишь нужный, например,
aws-notes с помощью #query:aws dynamodb scan --table-name jenkins --query
'Items[?jenkinsProject.S==`aws-notes`]'query
Сделать выборку по проекту
jenkinsProject - получить все билды:aws dynamodb query --table-name jenkins --max-items 100 --key-condition-expression
"jenkinsProject = :jp" --expression-attribute-values '{":jp": { "S": "aws-notes" } }'Как найти последнее значение билда (не обязательно совпадающее с количеством записей)? Для этого сделаем реверсивную выборку и получим последний элемент, выделив его с помощью #query и сделав таблицу:
aws dynamodb query --table-name jenkins --key-condition-expression
"jenkinsProject = :jp" --expression-attribute-values '{":jp": { "S": "aws-notes" } }' --no-scan-index-forward --max-items 1 --query Items[].buildNumber.N[] --output table-------
|Query|
+-----+
| 3 |
+-----+
delete-item
Удалим билд
1 из таблицы:aws dynamodb delete-item --table-name jenkins --key
'{ "jenkinsProject": {"S": "aws-notes"}, "buildNumber": {"N": "1"} }'delete-table
Удалим таблицу .
aws dynamodb delete-table --table-name jenkins
#DynamoDB #aws_cli
Отличный источник примеров работы с #CloudFormation #templates (а также #Terraform и #aws_cli) плюс прямые ссылки на документацию, официальные блоги, всяческие безопасности и различные #best_practices:
https://asecure.cloud/
Однозначно в закладки.
#security #info
https://asecure.cloud/
Однозначно в закладки.
#security #info
AWS CLI v2
Некоторое время назад в preview, а теперь полноценная замена:
https://aws.amazon.com/blogs/developer/aws-cli-v2-is-now-generally-available/
Чтобы поставить поверх текущей - нужно удалить ссылку предыдущей (первой) версии:
aws --version
which aws
rm -rf /usr/local/bin/aws
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
aws --version
Кто ставит не в дефолтную юзеровскую директорию (использует ключики
То для второй версии:
Иначе (если указать для второй аналогичное
#aws_cli
Некоторое время назад в preview, а теперь полноценная замена:
https://aws.amazon.com/blogs/developer/aws-cli-v2-is-now-generally-available/
Чтобы поставить поверх текущей - нужно удалить ссылку предыдущей (первой) версии:
aws --version
aws-cli/1.16.300 Python/2.7.16 Linux/4.14.97-90.72.amzn2.x86_64 botocore/1.13.36which aws
/usr/local/bin/awsrm -rf /usr/local/bin/aws
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
aws --version
aws-cli/2.0.0 Python/3.7.3 Linux/4.14.97-90.72.amzn2.x86_64 botocore/2.0.0dev4Кто ставит не в дефолтную юзеровскую директорию (использует ключики
-i и -b), обратите внимание, изменилась логика работы второго параметра -b, его нужно указывать без aws на конце - первая версия предполагает полный путь, а вторая лишь каталог для ссылки. Т.е. для первой нужно было, например:sudo ./awscli-bundle/install -i /usr/local/aws -b /usr/bin/awsТо для второй версии:
sudo ./aws/install -i /usr/local/aws-cli -b /usr/binИначе (если указать для второй аналогичное
/usr/bin/aws) увидите после установки:You can now run: /usr/bin/aws/aws --version#aws_cli
Amazon
AWS CLI v2 is now generally available | Amazon Web Services
We’re excited to announce the v2.0.0 GA release of the AWS CLI version 2 (v2). AWS CLI v2 builds on AWS CLI v1 and includes a number of features and enhancements based on community feedback. New Features The AWS CLI v2 offers several new features including…
Чтобы получить информацию о мастер-аккаунте, необязательно для этого лезть в мастер организации, можно в любом из аккаунтов выполнить:
aws organizations describe-organization
Т.е. это работает и в мастере, и в любом из под-аккаунтов.
А для получения в каком-то скрипте конкретно AWS ID мастера используем #query:
aws organizations describe-organization --query Organization.MasterAccountId --output text
#Organizations #aws_cli
aws organizations describe-organization
{
"Organization": {
"Id": "o-grkq8ea51d",
"Arn": "arn:aws:organizations::221433848249:organization/o-grkq8ea51d",
"FeatureSet": "ALL",
"MasterAccountArn": "arn:aws:organizations::221433848249:account/o-grkq8ea51d/221433848249",
"MasterAccountId": "221433848249",
"MasterAccountEmail": "admin@aws.notes",
"AvailablePolicyTypes": [
{
"Type": "SERVICE_CONTROL_POLICY",
"Status": "ENABLED"
}
]
}
}Т.е. это работает и в мастере, и в любом из под-аккаунтов.
А для получения в каком-то скрипте конкретно AWS ID мастера используем #query:
aws organizations describe-organization --query Organization.MasterAccountId --output text
221433848249#Organizations #aws_cli
CodeBuild и ECS
Когда из CodeBuild нужно работать с другим аккаунтом, и потребуется переключаться в роль с помощью флажка
Это потому, что вместо обычного:
В секции профиля файла
И всё заработает.
Почему? Получается, видимо, потому, что CodeBuild под капотом использует ECS.
В принципе, логично, хоть и не видел подобного в документации (что тоже логично).
#CodeBuild
Когда из 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
Telegram
aws_notes
Чтобы запустить #aws_cli команду для другого аккаунта, нужно сначала добавить в ~/.aws/config профиль типа:
[profile devops-codecommit]
role_arn = arn:aws:iam::123456789012:role/codecommit-role
credential_source = Ec2InstanceMetadata
Параметры:
devops-codecommit…
[profile devops-codecommit]
role_arn = arn:aws:iam::123456789012:role/codecommit-role
credential_source = Ec2InstanceMetadata
Параметры:
devops-codecommit…
aws --debug
В случае проблем не забывайте, что у AWS CLI есть стандартный ключик
https://docs.aws.amazon.com/cli/latest/reference/index.html
Например, казалось бы, простая команда просмотра имеющихся бакетов
Пользы в таком логе в общем случае нет, однако когда у вас какая-то непонятнейшая ошибка — очень может помочь.
Например, непонятно почему, команда отрабатывает не так, как вы планировали и пишет, что нет credentials или не хватает прав. Запустив с ключиком
В результате наглядно видны приоритеты получения aws-cli credentials, что вполне может навести на мысль, почему не работает как нужно.
Итого — не забываем про ключик
#aws_cli
В случае проблем не забывайте, что у AWS CLI есть стандартный ключик
--debug, где можно увидеть всё, что происходит под капотом во время выполнения любой команды.https://docs.aws.amazon.com/cli/latest/reference/index.html
Например, казалось бы, простая команда просмотра имеющихся бакетов
aws s3 ls даёт на выходе огромнейший лог (см. картинку и это лишь часть).Пользы в таком логе в общем случае нет, однако когда у вас какая-то непонятнейшая ошибка — очень может помочь.
Например, непонятно почему, команда отрабатывает не так, как вы планировали и пишет, что нет credentials или не хватает прав. Запустив с ключиком
--debug, можно пронаблюдать, как команда aws перебирает источники credentials, на картинке это строчки с:Looking for credentials via: envLooking for credentials via: assume-roleLooking for credentials via: shared-credentials-fileLooking for credentials via: custom-processLooking for credentials via: config-fileLooking for credentials via: ec2-credentials-fileLooking for credentials via: boto-configLooking for credentials via: container-roleLooking 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 или скачать/закачать какие-то файлы, то используем стандартный ключик монтирования
docker run -it
#aws_cli
Теперь не обязательно ставить 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