AWS от Dev к Dev: Учетные данные и программный доступ — часть 1

Изначально идея этого поста заключалась в том, чтобы рассказать о концепциях AWS IAM, но в итоге я отказался от этой идеи, поскольку эта информация есть в документации. Кроме того, AWS IAM настолько обширен, что этот пост был бы бесконечным.

Таким образом, предложение здесь иное. Я постараюсь ответить на некоторые распространенные вопросы, которые я получаю/вижу по поводу IAM. Поскольку их много, я разделю этот пост на части. В этой первой части я сосредоточусь на учетных данных пользователей IAM и программном доступе с помощью AWS CLI. Поехали?

Пререквизиты

  • Установите AWS CLI
  • Иметь учетную запись AWS
  • Создайте одного или нескольких пользователей IAM в AWS IAM

1. Где я могу получить свои полномочия?

При создании пользователя IAM ему предоставляется возможность программного доступа. Если опция выбрана, вы получите ключ_доступа и секретный_ключ.
Это ваши учетные данные для программного доступа (SDK, CLI).

2. Как настроить учетные данные?

Учетные данные могут быть настроены несколькими способами. Наиболее часто используются:

  • AWS CLI
  • файл (вручную или сгенерированный CLI)
  • переменная окружения

AWS CLI

Вы можете использовать команду aws configure для предоставления своих учетных данных. Выходные данные будут выглядеть примерно так:

$ aws configure
AWS Access Key ID [****************6TEK]: AIDAVGDKXECDYBS76YKXE
AWS Secret Access Key [****************eRkE]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: us-east-1
Default output format [None]: json
Войдите в полноэкранный режим Выход из полноэкранного режима

Обратите внимание на файлы, которые создаются на машине:

ls ~/.aws
config credentials
Войдите в полноэкранный режим Выход из полноэкранного режима

И если мы заглянем внутрь этих файлов:

$ cat ~/.aws/config
[default]
region = us-east-1
output = json

cat ~/.aws/credentials
[default]
aws_access_key_id = sdsada
aws_secret_access_key = sadsadasdsad
Войдите в полноэкранный режим Выход из полноэкранного режима

Обратите внимание, что вывод соответствует данным, которые мы указали в команде aws configure.

Файл

Вышеуказанные файлы можно также создавать и редактировать вручную. Вы можете просто сделать это:

$ vim ~/.aws/credentials
Войдите в полноэкранный режим Выход из полноэкранного режима

и завершите редактирование своего файла. Убедитесь, что вы знаете, как выйти из VIM, прежде чем сделать это 😋.

Переменная среды

Вы можете переопределить вышеуказанные файлы с помощью переменных окружения:

$ export AWS_ACCESS_KEY_ID=AIDAVGDKXECDYBS76YKXE
$ export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
$ export AWS_DEFAULT_REGION=us-west-2 
Войдите в полноэкранный режим Выход из полноэкранного режима

На самом деле, распространенная ошибка заключается в том, что вы установили переменную окружения, а CLI или SDK не считывает учетные данные из файла.

Обратите внимание, что если вы допустите какую-то опечатку, CLI будет продолжать получать учетные данные из файла. Итак, если вы установили переменную окружения, но она все равно не работает, проверьте, не допустили ли вы опечатку.

3. Как узнать, какого пользователя я использую?

Быстрый способ проверить это - сделать звонок:

$ aws sts get-caller-identity
{
    "UserId": "AIDAVGDKXECDYBS76YKXE",
    "Account": "123456789012",
    "Arn": "arn:aws:iam::123456789012:user/hugo-readonly-1"
}
Войдите в полноэкранный режим Выход из полноэкранного режима

4. Хорошо, теперь, когда у меня есть учетные данные, что дальше? Как я могу вызывать API AWS?

Теперь вы можете обращаться к AWS через AWS CLI или с помощью одного из многочисленных SDK, которые предоставляет AWS.
Чтобы продемонстрировать это, давайте воспользуемся одним из API DynamoDB. AWS DynamoDB - это база данных NoSQL AWS. Как насчет того, чтобы перечислить таблицы в нашей базе данных? Если мы попробуем использовать команду aws dynamodb help, то в ней перечислены документация и API, которые мы можем использовать. CLI также перечисляет возможные варианты, если мы вводим неправильную команду. Например:

$ aws dynamodb list

usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters]
To see help text, you can run:

  aws help
  aws <command> help
  aws <command> <subcommand> help

aws: error: argument operation: Invalid choice, valid choices are:

batch-execute-statement                  | batch-get-item
batch-write-item                         | create-backup
create-global-table                      | create-table
delete-backup                            | delete-item
delete-table                             | describe-backup
describe-continuous-backups              | describe-contributor-insights
describe-endpoints                       | describe-export
describe-global-table                    | describe-global-table-settings
describe-kinesis-streaming-destination   | describe-limits
describe-table                           | describe-table-replica-auto-scaling
describe-time-to-live                    | disable-kinesis-streaming-destination
enable-kinesis-streaming-destination     | execute-statement
execute-transaction                      | export-table-to-point-in-time
get-item                                 | list-backups
list-contributor-insights                | list-exports
list-global-tables                       | list-tables
list-tags-of-resource                    | put-item
query                                    | restore-table-from-backup
restore-table-to-point-in-time           | scan
tag-resource                             | transact-get-items
transact-write-items                     | untag-resource
update-continuous-backups                | update-contributor-insights
update-global-table                      | update-global-table-settings
update-item                              | update-table
update-table-replica-auto-scaling        | update-time-to-live
wizard                                   | wait
help
Войдите в полноэкранный режим Выход из полноэкранного режима

Обратите внимание, что существует несколько API list-. Хорошо, теперь, когда у нас есть права на список, давайте вызовем API list-tables? Я создал таблицу только для того, чтобы продемонстрировать использование CLI:

$aws dynamodb list-tables

An error occurred (AccessDeniedException) when calling the ListTables operation: User: arn:aws:iam::356706099335:user/hugo-readonly-1 is not authorized to perform: dynamodb:ListTables on resource: arn:aws:dynamodb:us-east-1:123456789012:table/* because no identity-based policy allows the dynamodb:ListTables action
Войдите в полноэкранный режим Выход из полноэкранного режима

Упс, ошибка разрешения... что теперь? 😥

5. У меня нет разрешения на вызов нужного мне API. И что теперь?

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

Хорошая практика: Создайте группы для пользователей IAM. Добавьте политики в эти группы и назначьте пользователей в группы. Избегайте прямого назначения политик пользователям.

Для получения подробной информации о том, как добавить политику к пользователю, вы можете обратиться к официальной документации.

Для простоты я добавлю разрешения непосредственно пользователю, но в качестве хорошей практики вам следует создать группу (например, devs) и назначить вашего пользователя в эту группу.
Я добавил к своему пользователю существующую политику AWS под названием AmazonDynamoDBReadOnlyAccess. Эта политика дает мне доступ к нескольким API, включая следующие API DynamoDB:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                ...
                "dynamodb:BatchGetItem",
                "dynamodb:Describe*",
                "dynamodb:List*",
                "dynamodb:GetItem",
                "dynamodb:Query",
                "dynamodb:Scan",
                "dynamodb:PartiQLSelect",
                ...
            ],
            "Effect": "Allow",
            "Resource": "*"
        },
        ...
    ]
}
Войдите в полноэкранный режим Выход из полноэкранного режима

Обратите внимание, как политика дает мне право вызывать API DynamoDB:List*. То есть, все API DynamoDB, которые начинаются с List. Теперь, когда у нас есть разрешение, мы можем вызвать API:

 aws dynamodb list-tables
{
    "TableNames": [
        "hugo_teste"
    ]
}
Войдите в полноэкранный режим Выход из полноэкранного режима

Круто, правда? Поскольку у нас есть имя таблицы, что если нам нужна дополнительная информация о ней? Посмотрев на список API, мы видим, что у нас есть разрешение на выполнение describe-table.

$ aws dynamodb describe-table hugo_teste

usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters]
To see help text, you can run:

  aws help
  aws <command> help
  aws <command> <subcommand> help

aws: error: the following arguments are required: --table-name
Войдите в полноэкранный режим Выход из полноэкранного режима

Упс, у меня ошибка! Пропущен аргумент --table-name.

$ aws dynamodb describe-table --table-name hugo_teste
{
    "Table": {
        "AttributeDefinitions": [
            {
                "AttributeName": "my_partition_key",
                "AttributeType": "S"
            }
        ],
        "TableName": "hugo_teste",
        "KeySchema": [
            {
                "AttributeName": "my_partition_key",
                "KeyType": "HASH"
            }
        ],
        "TableStatus": "ACTIVE",
        "CreationDateTime": "2022-08-09T16:27:24.046000-07:00",
        "ProvisionedThroughput": {
            "LastDecreaseDateTime": "2022-08-09T16:38:24.524000-07:00",
            "NumberOfDecreasesToday": 2,
            "ReadCapacityUnits": 1,
            "WriteCapacityUnits": 1
        },
        "TableSizeBytes": 0,
        "ItemCount": 0,
        "TableArn": "arn:aws:dynamodb:us-east-1:356706099335:table/hugo_teste",
        "TableId": "da75a055-61b0-479d-94e5-7c8dc2da806b"
    }
}
Войдите в полноэкранный режим Выход из полноэкранного режима

6. Но у меня есть 2 пользователя, один для Dev и другой для QA. Как сохранить 2 пользователей на одной машине?

Вы можете использовать переменные среды для переопределения, как мы обсуждали ранее, или использовать профили.

Лучшая практика: Используйте профили для поддержания доступа к нескольким различным пользователям IAM на вашей машине.

Например, я проверю 2 профиля в моих файлах ~/.aws/credentials и ~/.aws/config.

$ cat ~/.aws/credentials
[default]
aws_access_key_id = AIDAVGDKXECDYBS76YKXE
aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

[qa]
aws_access_key_id = AKIAVGDKXECDVL33JTNZ
aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYSAMPLEKEY

$ cat ~/.aws/config
[default]
region = us-east-1
output = json
cli_pager=

[profile qa]
region = us-east-1
output = json
cli_pager=

Войдите в полноэкранный режим Выход из полноэкранного режима

Обратите внимание на тонкое различие в синтаксисе файла. Файл config использует префикс profile перед именем QA.

Теперь у меня есть возможность вызвать CLI, используя профиль по умолчанию (без аргументов):

aws sts get-caller-identity
{
    "UserId": "AIDAVGDKXECDYBS76YKXE",
    "Account": "123456789012",
    "Arn": "arn:aws:iam::123456789012:user/hugo-readonly-1"
}
Войдите в полноэкранный режим Выход из полноэкранного режима

Или я могу вызвать CLI, передав профиль, который я хочу принять:

$ aws sts get-caller-identity --profile qa
{
    "UserId": "AKIAVGDKXECDVL33JTNZ",
    "Account": "123456789012",
    "Arn": "arn:aws:iam::123456789012:user/hugo-readonly-2"
}
Войдите в полноэкранный режим Выход из полноэкранного режима

AWS CLI очень полезен для написания сценариев или быстрого тестирования. Например, в прошлом я часто использовал его для отправки шаблонов AWS Cloudformation в AWS для создания всех моих ресурсов во время разработки/тестирования.

Заключение

На этом давайте завершим первую часть. Вкратце, на сегодняшний день мы увидели:

  • Как настроить учетные данные
  • Как проверить, с каким именем вы звоните
  • Как разрешения позволяют выполнять вызовы AWS программно
  • (бонус) Как использовать AWS CLI для программного взаимодействия с API AWS
  • Использование разных профилей для хранения учетных данных для разных пользователей IAM.

В следующих статьях мы подробнее поговорим о ролях IAM и программном доступе с использованием SDK и поставщиков учетных данных.

Вам понравилось? Ставьте лайк 💙 и оставляйте вопросы, на которые я буду отвечать.

Оцените статью
devanswers.ru
Добавить комментарий