Предоставить доступ экземпляру 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, но вы можете попробовать следующее.

  1. Создайте нового пользователя в AWS IAM и загрузите файл учетных данных.
  2. Этот пользователь будет представлять ваш сервер EC2.
  3. Предоставьте пользователю разрешения для вашего S3 Bucket.
  4. Затем поместите файл учетных данных в следующую папку: -
    EC2 - Экземпляр Windows:
    а. Разместите файл учетных данных в любом месте. (например, C:/ учетные данные)
    б. Создайте переменную среды AWS_CREDENTIAL_PROFILES_FILE и поместите значение в качестве пути, куда вы помещаете свой файл учетных данных (например, C:/ credentials)
    EC2 - Экземпляр Linux
    а. Следуйте инструкциям экземпляра Windows
    б. Создайте папку .aws внутри корневой папки вашего сервера приложений (например, / usr / share / tomcat6).
    с. Создайте символическую ссылку между вашей переменной окружения и вашей папкой .aws sudo ln -s $AWS_CREDENTIAL_PROFILES_FILE /usr/share/tomcat6/.aws/credentials

  5. Теперь, когда ваш файл учетных данных размещен, вы можете использовать код 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 году, есть гораздо более простой и понятный способ сделать это (учетные данные никогда не нужно хранить в экземпляре, вместо этого он может запрашивать их автоматически):

  1. создайте роль IAM для вашего экземпляра и назначьте ее
  2. создать политику для предоставления доступа к вашей корзине s3
  3. назначить политику роли IAM экземпляра
  4. загружать / скачивать объекты, например, через 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, чтобы все заработало.

Другие вопросы по тегам