Предоставить доступ экземпляру EC2 к S3 Bucket
Я хочу предоставить своему экземпляру ec2 доступ к корзине s3.
На этом экземпляре ec2 запускается контейнер с моим приложением. Теперь я не получаю разрешения на ведро s3.
Это моя политика
{
"Version": "2012-10-17",
"Id": "Policy1462808223348",
"Statement": [
{
"Sid": "Stmt1462808220978",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::714656454815:role/ecsInstanceRole"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::bucket-name/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "private-ip/32"
}
}
}
]
}
Но это не сработает, пока я не дам ведру разрешение на доступ к нему всем.
Я пытаюсь свернуть файл в корзине s3 из экземпляра ec2, но это тоже не работает.
3 ответа
Не существует прямого способа предоставления доступа к экземпляру "EC2" серверу AWS, но вы можете попробовать следующее.
- Создайте нового пользователя в AWS IAM и загрузите файл учетных данных.
- Этот пользователь будет представлять ваш сервер EC2.
- Предоставьте пользователю разрешения для вашего S3 Bucket.
Затем поместите файл учетных данных в следующую папку: -
EC2 - Экземпляр Windows:
а. Разместите файл учетных данных в любом месте. (например, C:/ учетные данные)
б. Создайте переменную среды AWS_CREDENTIAL_PROFILES_FILE и поместите значение в качестве пути, куда вы помещаете свой файл учетных данных (например, C:/ credentials)
EC2 - Экземпляр Linux
а. Следуйте инструкциям экземпляра Windows
б. Создайте папку .aws внутри корневой папки вашего сервера приложений (например, / usr / share / tomcat6).
с. Создайте символическую ссылку между вашей переменной окружения и вашей папкой .awssudo ln -s $AWS_CREDENTIAL_PROFILES_FILE /usr/share/tomcat6/.aws/credentials
Теперь, когда ваш файл учетных данных размещен, вы можете использовать код Java для доступа к корзине.
ПРИМЕЧАНИЕ. Для этого требуются библиотеки AWS-SDK.
AWSCredentials credentials = null;
try {
credentials = new ProfileCredentialsProvider().getCredentials();
} catch (Exception e) {
LOG.error("Unable to load credentials " + e);
failureMsg = "Cannot connect to file server.";
throw new AmazonClientException(
"Cannot load the credentials from the credential profiles file. " +
"Please make sure that your credentials file is at the correct " +
"location (environment variable : AWS_CREDENTIAL_PROFILES_FILE), and is in valid format.",
e);
}
AmazonS3 s3 = new AmazonS3Client(credentials);
Region usWest2 = Region.getRegion(Regions.US_WEST_2);
s3.setRegion(usWest2);
ObjectListing objectListing = s3.listObjects(new ListObjectsRequest().withBucketName(bucketName).withPrefix(prefix));
Где bucketName = [Ваше имя корзины]
и префикс = [структура вашей папки внутри корзины, где находятся ваши файлы]
Надеюсь, это поможет. Кроме того, если вы не используете Java, вы можете использовать AWS-SDK на других языках программирования.
По крайней мере, сейчас, в 2019 году, есть гораздо более простой и понятный способ сделать это (учетные данные никогда не нужно хранить в экземпляре, вместо этого он может запрашивать их автоматически):
- создайте роль IAM для вашего экземпляра и назначьте ее
- создать политику для предоставления доступа к вашей корзине s3
- назначить политику роли IAM экземпляра
- загружать / скачивать объекты, например, через aws cli для s3 - cp, например
aws s3 cp <S3Uri> <LocalPath>
@2: Пример политики JSON, разрешающей доступ для чтения и записи к объектам в сегменте S3:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ListObjectsInBucket",
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::bucket-name"]
},
{
"Sid": "AllObjectActions",
"Effect": "Allow",
"Action": "s3:*Object",
"Resource": ["arn:aws:s3:::bucket-name/*"]
}
]
}
Вы должны изменить разрешенные действия и заменить "bucket-name"
Я узнал это....
Работает только с публичным IP из экземпляра ec2.
Попробуй это:
{
"Version": "2012-10-17",
"Id": "Policy1462808223348",
"Statement": [
{
"Sid": "Stmt1462808220978",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::bucket-name/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "yourIp/24"
}
}
}
]
}
Я столкнулся с той же проблемой. Я, наконец, решил это, создав точку доступа для рассматриваемой корзины с помощью AWS CLI, см. https://docs.aws.amazon.com/AmazonS3/latest/dev/creating-access-points.html, а затем я создал корзину политика как следующая
{
"Version": "2012-10-17",
"Id": "Policy1583357393961",
"Statement": [
{
"Sid": "Stmt1583357315674",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<account-id>:role/ecsInstanceRole"
},
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::<your-bucket>"
},
{
"Sid": "Stmt1583357391961",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<account-id>:role/ecsInstanceRole"
},
"Action": [
"s3:GetObject"
],
"Resource": "arn:aws:s3:::<your-bucket>/*"
}
]
}
Убедитесь, что вы используете более новую версию aws cli (1.11.xxx у меня не работает). Я наконец установил cli версии 2, чтобы все заработало.