Я довольно новичок в Бото и 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.