Boto неправильно загружает учетные данные IAM, когда в роли используется более одного правила - PullRequest
0 голосов
/ 09 июня 2018

Я довольно новичок в Бото и AWS.Может кто-нибудь прояснить ошибку ниже?Я хочу, чтобы BOTO из экземпляра EC2 имел доступ к службам s3 и SSM путем наследования учетных данных, предоставленных ему ролью IAM, прикрепленной к экземпляру.

Я делаю это в Amazon Linux IAM.Использование Python2 в miniconda2.

При попытке подключения к s3 я получаю следующую ошибку с учетными данными.

import boto
boto.connect_s3()

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/root/miniconda2/lib/python2.7/site-packages/boto/__init__.py", line 141, in connect_s3
    return S3Connection(aws_access_key_id, aws_secret_access_key, **kwargs)
  File "/root/miniconda2/lib/python2.7/site-packages/boto/s3/connection.py", line 194, in __init__
    validate_certs=validate_certs, profile_name=profile_name)
  File "/root/miniconda2/lib/python2.7/site-packages/boto/connection.py", line 555, in __init__
    profile_name)
  File "/root/miniconda2/lib/python2.7/site-packages/boto/provider.py", line 201, in __init__
    self.get_credentials(access_key, secret_key, security_token, profile_name)
  File "/root/miniconda2/lib/python2.7/site-packages/boto/provider.py", line 377, in get_credentials
    self._populate_keys_from_metadata_server()
  File "/root/miniconda2/lib/python2.7/site-packages/boto/provider.py", line 394, in _populate_keys_from_metadata_server
    creds = self._get_credentials_from_metadata(metadata)
  File "/root/miniconda2/lib/python2.7/site-packages/boto/provider.py", line 424, in _get_credentials_from_metadata
    "%s" % (msg))
boto.exception.InvalidInstanceMetadataError: Expected a dict type of credentials instead received an empty string
You can set the 'metadata_service_num_attempts' in your boto config file to increase the number of times boto will attempt to retrieve credentials from the instance metadata service.

Приведенный выше код работает, когда я назначаю ему роль IAM с одной политикой, котораявыглядит следующим образом:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": "*"
        }
}

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

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssm:DescribeAssociation",
                "ssm:GetDeployablePatchSnapshotForInstance",
                "ssm:GetDocument",
                "ssm:GetManifest",
                "ssm:GetParameters",
                "ssm:ListAssociations",
                "ssm:ListInstanceAssociations",
                "ssm:PutInventory",
                "ssm:PutComplianceItems",
                "ssm:PutConfigurePackageResult",
                "ssm:UpdateAssociationStatus",
                "ssm:UpdateInstanceAssociationStatus",
                "ssm:UpdateInstanceInformation"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2messages:AcknowledgeMessage",
                "ec2messages:DeleteMessage",
                "ec2messages:FailMessage",
                "ec2messages:GetEndpoint",
                "ec2messages:GetMessages",
                "ec2messages:SendReply"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "cloudwatch:PutMetricData"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstanceStatus"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ds:CreateComputer",
                "ds:DescribeDirectories"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:DescribeLogGroups",
                "logs:DescribeLogStreams",
                "logs:PutLogEvents"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:AbortMultipartUpload",
                "s3:ListMultipartUploadParts",
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads"
            ],
            "Resource": "*"
        }
    ]
}

Я бынравится избегать добавления учетных данных в файл .aws / credentials.

...