serverless.yml
を利用してバケットを作成し、サーバーレスフレームワークのデプロイプロセス中に特定のファイルを追加できるかどうか疑問に思っています。
これまでのところ、バケットを作成するS3リソースを追加できましたが、特定のファイルを追加する方法がわかりません。
resources:
Resources:
UploadBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: ${self:custom.s3.bucket}
AccessControl: Private
CorsConfiguration:
CorsRules:
- AllowedMethods:
- GET
- PUT
- POST
- HEAD
AllowedOrigins:
- "*"
AllowedHeaders:
- "*"
それが可能かどうか、またはserverless.yml
を利用して、デプロイプロセス中にデフォルトファイルがまだない場合にそれをアップロードする方法がわかりません。
バケット内の個々のS3オブジェクトを管理(追加/削除)する公式のAWS CloudFormationリソースはありませんが、Lambda関数を使用して Custom Resource を使用して作成できます PUT Object
/ DELETE Object
AWS SDK for NodeJSを使用するAPI。
CloudFormationテンプレートの完全な例を以下に示します。
Description: Create an S3 Object using a Custom Resource.
Parameters:
BucketName:
Description: S3 Bucket Name (must not already exist)
Type: String
Key:
Description: S3 Object Key
Type: String
Body:
Description: S3 Object Body
Type: String
Resources:
Bucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Ref BucketName
S3Object:
Type: Custom::S3Object
Properties:
ServiceToken: !GetAtt S3ObjectFunction.Arn
Bucket: !Ref Bucket
Key: !Ref Key
Body: !Ref Body
S3ObjectFunction:
Type: AWS::Lambda::Function
Properties:
Description: S3 Object Custom Resource
Handler: index.handler
Role: !GetAtt LambdaExecutionRole.Arn
Code:
ZipFile: !Sub |
var response = require('cfn-response');
var AWS = require('aws-sdk');
var s3 = new AWS.S3();
exports.handler = function(event, context) {
var respond = (e) => response.send(event, context, e ? response.FAILED : response.SUCCESS, e ? e : {});
var params = event.ResourceProperties;
delete params.ServiceToken;
if (event.RequestType == 'Create' || event.RequestType == 'Update') {
s3.putObject(params).promise()
.then((data)=>respond())
.catch((e)=>respond(e));
} else if (event.RequestType == 'Delete') {
delete params.Body;
s3.deleteObject(params).promise()
.then((data)=>respond())
.catch((e)=>respond(e));
} else {
respond({Error: 'Invalid request type'});
}
};
Timeout: 30
Runtime: nodejs4.3
LambdaExecutionRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal: {Service: [lambda.amazonaws.com]}
Action: ['sts:AssumeRole']
Path: /
ManagedPolicyArns:
- "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
Policies:
- PolicyName: S3Policy
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- 's3:PutObject'
- 'S3:DeleteObject'
Resource: !Sub "arn:aws:s3:::${BucketName}/${Key}"
serverless.yml
構成ファイル内でこれらのリソースを使用することもできますが、サーバーレスがCloudFormationのリソース/パラメーターとどのように統合されるかについては明確ではありません。
Serverless-s3-syncプラグインを調べましたか。これにより、デプロイメントの一部としてローカルマシンからS3にフォルダーをアップロードできます。
plugins:
- serverless-s3-sync
custom:
s3Sync:
- bucketName: ${self:custom.s3.bucket} # required
bucketPrefix: assets/ # optional
localDir: dist/assets # required
これを実行してWebサイトをデプロイする場合は、 serverless-finch を使用できます。まだ存在しない場合は、バケットが自動的に作成されます。