Installing serverless-iiif
as part of a CloudFormation (opens in a new tab) template makes it easy to integrate the service with other components. Please refer to the example and the CloudFormation documentation (opens in a new tab) for more information on how you might tailor these templates to your own needs and deploy them to AWS.
Syntax
To declare this entity in your AWS CloudFormation template, use the following syntax:
Type: AWS::Serverless::Application
Properties:
Location:
ApplicationId: arn:aws:serverlessrepo:us-east-1:625046682746:applications/serverless-iiif-standalone-dev
SemanticVersion: 5.0.0
Parameters:
CorsAllowCredentials: String
CorsAllowHeaders: String
CorsAllowOrigin: String
CorsExposeHeaders: String
CorsMaxAge: Number
ForceHost: String
IiifLambdaMemory: Number
IiifLambdaTimeout: Number
PixelDensity: Number
Preflight: String
PyramidLimit: Number
ResolverTemplate: String
SharpLayer: String
SourceBucket: String
Properties
CorsAllowCredentials
Value of the CORS
Access-Control-Allow-Credentials
response header. Must betrue
to allow requests withAuthorization
and/orCookie
headers.Required: No
Type: String
Allowed Values:
false | true
CorsAllowHeaders
Value of the CORS
Access-Control-Allow-Headers
response headerRequired: No
Type: String
Default:
*
CorsAllowOrigin
Value of the CORS
Access-Control-Allow-Origin
response header. Use the special valueREFLECT_ORIGIN
to copy the value from theOrigin
request header (required to emulate*
for XHR requests usingAuthorization
and/orCookie
headers).Required: No
Type: String
Default:
*
CorsExposeHeaders
Value of the CORS
Access-Control-Expose-Headers
response headerRequired: No
Type: String
Default:
cache-control,content-language,content-length,content-type,date,expires,last-modified,pragma
CorsMaxAge
Value of the CORS
Access-Control-MaxAge
response headerRequired: No
Type: Number
Default:
3600
ForceHost
Forced hostname to use in responses
Required: No
Type: String
Default:
""
IiifLambdaMemory
The memory provisioned for the lambda.
Required: No
Type: Number
Default:
3008
Min Value:
128
Max Value:
10240
IiifLambdaTimeout
The timeout for the lambda.
Required: No
Type: Number
Default:
10
PixelDensity
Hardcoded DPI/Pixel Density/Resolution to encode in output images
Required: No
Type: Number
Default:
0
Min Value:
0
Preflight
Indicates whether the function should expect preflight headers
Required: No
Type: String
Allowed Values:
false | true
PyramidLimit
Smallest pyramid image dimension. Set to
0
to prevent server from auto-calculating pyramid page sizes.Required: No
Type: Number
Default:
256
Min Value:
0
ResolverTemplate
A printf-style format string that determines the location of source image within the bucket given the image ID
Required: No
Type: String
Default:
%s.tif
SharpLayer
ARN of a custom AWS Lambda Layer containing the sharp and libvips dependencies. Use the special value
JP2
to use the managed JPEG2000-compatible layer, orINTERNAL
to use the built-in dependencies (without JPEG2000 support).Required: No
Type: String
Default:
JP2
Allowed Pattern:
^INTERNAL$|^JP2$|^arn:aws:lambda:.*:.*:layer:.+:\d+$
SourceBucket
Name of bucket containing source images
Required: Yes
Type: String
Example
This example template will deploy a full application stack consisting of:
- A serverless-iiif image server
- A CloudFront distribution with a custom hostname and SSL certificate
AWSTemplateFormatVersion: 2010-09-09
Description: IIIF Image server w/CloudFront Caching & Custom Hostname
Parameters:
CacheDomainName:
Type: String
Description: Custom Domain Name for the CloudFront Cache
CacheHostName:
Type: String
Description: Custom Hostname for the CloudFront Cache
CacheSSLCertificate:
Type: String
Description: ARN of the ACM SSL Certification to use for the API Gateway
Endpoint or CloudFront Cache
IiifSourceBucket:
Type: String
Description: Name of bucket containing source images
Resources:
ServerlessIiif:
Type: AWS::Serverless::Application
Properties:
Location:
ApplicationId: arn:aws:serverlessrepo:us-east-1:625046682746:applications/serverless-iiif
SemanticVersion: 5.1.1
Parameters:
ForceHost: !Sub "${CacheHostName}.${CacheDomainName}"
SourceBucket: !Ref IiifSourceBucket
ResponseHeaderPolicy:
Type: AWS::CloudFront::ResponseHeadersPolicy
Properties:
ResponseHeadersPolicyConfig:
Name: !Sub "${AWS::StackName}-allow-cors-response-headers"
Comment: Allows IIIF CORS response headers
CorsConfig:
AccessControlAllowCredentials: false
AccessControlAllowHeaders:
Items:
- "*"
AccessControlAllowMethods:
Items:
- GET
- OPTIONS
AccessControlAllowOrigins:
Items:
- "*"
AccessControlExposeHeaders:
Items:
- cache-control
- content-language
- content-length
- content-type
- date
- expires
- last-modified
- pragma
AccessControlMaxAgeSec: 3600
OriginOverride: false
CachingEndpoint:
Type: AWS::CloudFront::Distribution
Properties:
DistributionConfig:
Enabled: true
PriceClass: PriceClass_100
Aliases:
- !Sub "${CacheHostName}.${CacheDomainName}"
ViewerCertificate:
AcmCertificateArn: !Ref CacheSSLCertificate
MinimumProtocolVersion: TLSv1
SslSupportMethod: sni-only
Origins:
- Id: IiifLambda
CustomOriginConfig:
OriginProtocolPolicy: https-only
DomainName: !GetAtt ServerlessIiif.Outputs.FunctionDomain
DefaultCacheBehavior:
TargetOriginId: IiifLambda
ViewerProtocolPolicy: https-only
AllowedMethods:
- GET
- HEAD
- OPTIONS
CachedMethods:
- GET
- HEAD
CachePolicyId: 658327ea-f89d-4fab-a63d-7e88639e58f6
ResponseHeadersPolicyId: !Ref ResponseHeaderPolicy
Route53Record:
Type: AWS::Route53::RecordSet
Properties:
Name: !Sub "${CacheHostName}.${CacheDomainName}"
HostedZoneName: !Sub "${CacheDomainName}."
Type: A
AliasTarget:
DNSName: !GetAtt CachingEndpoint.DomainName
HostedZoneId: Z2FDTNDATAQYW2
Outputs:
EndpointV2:
Description: IIIFv2 Endpoint URL
Value: !Sub "https://${CacheHostName}.${CacheDomainName}/iiif/2"
EndpointV3:
Description: IIIFv3 Endpoint URL
Value: !Sub "https://${CacheHostName}.${CacheDomainName}/iiif/3"
DistributionId:
Description: Caching Distribution ID
Value: !Ref CachingEndpoint
Export:
Name: !Sub "${AWS::StackName}:DistributionId"