Skip to content

AWS S3 Resolver

Edit this page

The AwsS3Resolver resolver enables cache resolution using Amazon S3 using the Aws\S3\S3Client.

Dependencies

This cache resolver requires the aws-sdk-php library, which can be installed by executing the following command in your project directory:

1
$ composer require aws/aws-sdk-php

Configuration

To begin, you must assign your AWS key, secret, bucket, and region to their respective parameters.

1
2
3
4
5
6
7
8
# app/config/config.yml or app/config/parameters.yml

parameters:
    amazon.s3.key:     "your-aws-key"
    amazon.s3.secret:  "your-aws-secret"
    amazon.s3.bucket:  "your-bucket.example.com"
    amazon.s3.region:  "your-bucket-region"
    amazon.s3.version: "2006-03-01"

Note

To not confuse the cache resolver, use the bucket.domain.tld notation. Specifying the bucket in a path (domain.tld/bucket) does not work.

Prerequisites

Create Resolver from a Factory

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# app/config/config.yml

liip_imagine:
    resolvers:
        aws_s3_resolver:
            aws_s3:
                client_config:
                    credentials:
                        key:    "%amazon.s3.key%"
                        secret: "%amazon.s3.secret%"
                    region: "%amazon.s3.region%"
                    version: "%amazon.s3.version%"
                bucket: "%amazon.s3.bucket%"
                get_options:
                    Scheme: https
                put_options:
                    CacheControl: "max-age=86400"

Tip

If using aws-sdk-php < 3.0.0, you must omit the credentials key and instead place the key and secret keys at the same level as region and bucket.

1
2
3
4
5
6
7
8
9
# app/config/services.yml

services:
    aws_s3:
        client_config:
            key:    "%amazon.s3.key%"
            secret: "%amazon.s3.secret%"
            region: "%amazon.s3.region%"
            bucket: "%amazon.s3.bucket%"

Create Resolver as a Service

While creating the resolver through a factory using the configuration above does the job for most use cases, it can sometimes be neccessary to create the resolver as a service.

Tip

For example, this is required if you do not want to hard code AWS credentials for your resolver, but instead make it use the Default Credential Provider Chain within AWS (for example, because you are running this on an EC2 instance which is already attached to an IAM role with the required permissions). In this case, simply setting up the resolver through a factory configuration block and leaving out the credentials block won't cut it. Instead, you need to set up the resolver as a service as shown below, passing an S3Client.

You have to set up the services required:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# app/config/services.yml

services:
    acme.amazon_s3:
        class: Aws\S3\S3Client
        factory: [Aws\S3\S3Client, factory]
        arguments:
            -
                credentials: { key: "%amazon.s3.key%", secret: "%amazon.s3.secret%" }
                region: "%amazon.s3.region%"
                version: "%amazon.s3.version%"

    acme.imagine.cache.resolver.aws_s3_resolver:
        class: Liip\ImagineBundle\Imagine\Cache\Resolver\AwsS3Resolver
        arguments:
            - "@acme.amazon_s3"
            - "%amazon.s3.bucket%"
        tags:
            - { name: "liip_imagine.cache.resolver", resolver: "aws_s3_resolver" }

Tip

If using aws-sdk-php < 3.0.0, you must omit the credentials key and instead place the key and secret keys at the same level as region and bucket.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# app/config/services.yml

services:
    acme.amazon_s3:
        # ...
        arguments:
            -
                key: "%amazon.s3.key%"
                secret: "%amazon.s3.secret%"
                region: "%amazon.s3.region%"

acme.amazon_s3:
    class: Aws\S3\S3Client
    factory: [Aws\S3\S3Client, factory]
    arguments:
        -
            credentials: { key: "%amazon.s3.key%", secret: "%amazon.s3.secret%" }
            region: "%amazon.s3.region%"
            version: "%amazon.s3.version%"

Usage

After configuring AwsS3Resolver, you can set it as the default cache resolver for LiipImagineBundle using the following configuration:

1
2
3
4
# app/config/config.yml

liip_imagine:
    cache: aws_s3_resolver

Usage on a Specific Filter

Alternatively, you can set AmazonS3Resolver as the cache resolver for a specific filter set using the following configuration.

1
2
3
4
5
6
7
8
9
# app/config/config.yml

liip_imagine:
    filter_sets:
        cache: ~
        my_thumb:
            cache: aws_s3_resolver
            filters:
                # the filter list

Tip

If you want to use other buckets for other images, simply alter the parameter names and create additional services.

Additional Options

You can use Cache and Proxy resolvers in chain with current. You just need to configure them with defined options.

1
2
3
4
5
6
7
8
9
# app/config/config.yml

liip_imagine:
    resolvers:
       aws_s3_resolver:
          aws_s3:
              #...
              proxies: ["https://one.domain.com", "https://two.domain.com"]
              cache: true

If enabled both first one will be Cache, then Proxy and after all process delegates to AwsS3 resolver.

Object GET Options

In order to make use of the object GET options, you can simply add a call to the service, to alter those options you need.

1
2
3
4
5
6
7
8
9
10
11
12
13
# app/config/services.yml

services:
    acme.imagine.cache.resolver.aws_s3_resolver:
        class: Liip\ImagineBundle\Imagine\Cache\Resolver\AwsS3Resolver
        arguments:
            - "@acme.amazon_s3"
            - "%amazon_s3.bucket%"
        calls:
             # This calls $service->setGetOption('Scheme', 'https');
             - [ setGetOption, [ Scheme, https ] ]
        tags:
            - { name: "liip_imagine.cache.resolver", resolver: "aws_s3_resolver" }

You can also use the constructor of the resolver to directly inject multiple options.

1
2
3
4
5
6
7
8
9
10
11
12
# app/config/services.yml

services:
    acme.imagine.cache.resolver.aws_s3_resolver:
        class: Liip\ImagineBundle\Imagine\Cache\Resolver\AwsS3Resolver
        arguments:
            - "@acme.amazon_s3"
            - "%amazon_s3.bucket%"
            - "public-read" # Aws\S3\Enum\CannedAcl::PUBLIC_READ (default)
            - { Scheme: https }
        tags:
            - { name: "liip_imagine.cache.resolver", resolver: "aws_s3_resolver" }

Object PUT Options

Similar to Object GET Options you can configure additional options to be passed to S3 when storing objects. This is useful, for example, to configure Cache- control headers returned when serving object from S3. See S3 SDK documentation for the list of available options.

Note, that the following options are configured automatically and will be ignored, even if you configure it via ObjectOptions:

  • Bucket
  • Key
  • Body
  • ContentType

In order to make use of the object PUT options, you can simply add a call to the service, to alter those options you need.

1
2
3
4
5
6
7
8
9
10
11
12
13
# app/config/services.yml

services:
    acme.imagine.cache.resolver.aws_s3_resolver:
        class: Liip\ImagineBundle\Imagine\Cache\Resolver\AwsS3Resolver
        arguments:
            - "@acme.amazon_s3"
            - "%amazon_s3.bucket%"
        calls:
             # This calls $service->setPutOption('CacheControl', 'max-age=86400');
             - [ setPutOption, [ CacheControl, "max-age=86400" ] ]
        tags:
            - { name: "liip_imagine.cache.resolver", resolver: "aws_s3_resolver" }

You can also use the constructor of the resolver to directly inject multiple options.

1
2
3
4
5
6
7
8
9
10
11
12
13
# app/config/services.yml

services:
    acme.imagine.cache.resolver.aws_s3_resolver:
        class: Liip\ImagineBundle\Imagine\Cache\Resolver\AwsS3Resolver
        arguments:
            - "@acme.amazon_s3"
            - "%amazon_s3.bucket%"
            - "public-read" # Aws\S3\Enum\CannedAcl::PUBLIC_READ (default)
            - { Scheme: https }
            - { CacheControl: "max-age=86400" }
        tags:
            - { name: "liip_imagine.cache.resolver", resolver: "aws_s3_resolver" }

You can find an example with private ACL and signed url on the events chapter.

This work, including the code samples, is licensed under a Creative Commons BY-SA 3.0 license.
TOC
    Version