はじめに
花粉がかなり舞って、マスクしてる方多いですよね。僕の周りの方々もくしゃみしたりして大変そうです。
今回はエラー特集と題して、Serverless Frameworkを使ってて出たエラーの対処法(ちょっとだけ)をお送りします。
(後、やったほうがいいことも)
エラーその1 「Missing required key 'Bucket' in params」
エラー内容
最初にserverless.ymlの「service」名を変更した後、sls deployを実行したときにこのようなエラーが発生しました。
An error occurred: ServerlessDeploymentBucket - API: s3:CreateBucket Access Denied.
S3の権限がないのかと思い、serverless.ymlを見直してもフルアクセスになってました
{
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::*"
]
},
sls deply
と sls remove
を繰り返し実行していると、以下のメッセージに到達。
user@ubuntu:~/serverlessframework$ sls deploy
Serverless: Installing requirements of requirements.txt in .serverless...
Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Injecting required Python packages to package...
Serverless Error ---------------------------------------
Missing required key 'Bucket' in params
Get Support --------------------------------------------
Docs: docs.serverless.com
Bugs: github.com/serverless/serverless/issues
Forums: forum.serverless.com
Chat: gitter.im/serverless/serverless
Your Environment Information -----------------------------
OS: linux
Node Version: 9.5.0
Serverless Version: 1.26.1
対処
一番最初に出てたエラーメッセージ An error occurred: ServerlessDeploymentBucket - API: s3:CreateBucket Access Denied.
をキーワードに調査してみると CloudFormation
というキーワードが出てきたので、Stackを削除。
以後は正常にデプロイされました。
その他
他にも確認するべきところがあり、S3バケットが上限(100)に達していないかなども確認しておくべきポイントです。
参考URL
エラーその2 「ServerlessError: Signature expired」
エラー内容
単純にデプロイ sls deploy
を実行してみました。すると以下のメッセージが出力
Serverless Error ---------------------------------------
ServerlessError: Signature expired: 20180412T100757Z is now earlier than 20180412T101229Z (20180412T101729Z - 5 min.)
Stack Trace --------------------------------------------
AWSにデプロイするときにクライアント側の時刻が現在時刻と10分以上差があったので、 Signature expired
が発生。
対処
時刻がズレてるので、時刻同期をしました。
$ sudo ntpdate -v ntp.nict.jp
参考URL
番外編:やったほうがいいこと
Serverless Frameworを使って開発を行っているとどうしてもserverless.ymlが大きくなってメンテナンスがしにくくなってきます。
そんなときにファイルを分けて書く方法があります。
分割前
service: sls-sample
plugins:
- serverless-python-requirements
provider:
name: aws
runtime: python3.6
# you can overwrite defaults here
stage: dev
region: ap-northeast-1
# AWS IAM for Lambda
iamRoleStatements:
- Effect: "Allow"
Action:
- "ec2:CreateNetworkInterface"
- "ec2:DescribeNetworkInterfaces"
- "ec2:DeleteNetworkInterface"
Resource:
- "*"
- Effect: "Allow"
Action:
- "dynamodb:PutItem"
- "dynamodb:GetItem"
Resource:
- "*"
- Effect: "Allow"
Action:
- "sns:Publish"
Resource:
- "arn:aws:sns:ap-northeast-1:xxxxxxxxxxxxx:example-topic"
- Effect: "Allow"
Action:
- "logs:CreateExportTask"
Resource:
- "arn:aws:logs:ap-northeast-1:xxxxxxxxxxxxx:log-group:/aws/lambda/lambda-log:log-stream:"
functions:
lambda_handler001:
handler: handler.main
events:
- schedule: cron(0 * ? * * *)
lambda_handler002:
handler: handler.main
events:
- schedule: cron(0 * ? * * *)
lambda_handler003:
handler: handler.main
events:
- schedule: cron(0 * ? * * *)
lambda_handler004:
handler: handler.main
events:
- schedule: cron(0 * ? * * *)
lambda_handler005:
handler: handler.main
events:
- schedule: cron(0 * ? * * *)
分割後
serverless.yml
service: sls-sample
plugins:
- serverless-python-requirements
provider:
name: aws
runtime: python3.6
# you can overwrite defaults here
stage: dev
region: ${file(./config/aws.yml):region}
# AWS IAM for Lambda
iamRoleStatements:
- Effect: "Allow"
Action:
- "ec2:CreateNetworkInterface"
- "ec2:DescribeNetworkInterfaces"
- "ec2:DeleteNetworkInterface"
Resource:
- "*"
- Effect: "Allow"
Action:
- "dynamodb:PutItem"
- "dynamodb:GetItem"
Resource:
- "*"
- Effect: "Allow"
Action:
- "sns:Publish"
Resource:
- "arn:aws:sns:ap-northeast-1:xxxxxxxxxxxxx:example-topic"
- Effect: "Allow"
Action:
- "logs:CreateExportTask"
Resource:
- "arn:aws:logs:ap-northeast-1:xxxxxxxxxxxxx:log-group:/aws/lambda/lambda-log:log-stream:"
functions:
${file(./config/functions.yml)
config/functions.yml
lambda_handler001:
handler: handler001.main
events:
- schedule: cron(0 * ? * * *)
lambda_handler002:
handler: handler002.main
events:
- schedule: cron(0 * ? * * *)
lambda_handler003:
handler: handler003.main
events:
- schedule: cron(0 * ? * * *)
lambda_handler004:
handler: handler004.main
events:
- schedule: cron(0 * ? * * *)
lambda_handler005:
handler: handler005.main
events:
- schedule: cron(0 * ? * * *)
config/aws.yml
region: ap-northeast-1
それから
これ以外にも色々serverless.ymlの書き方があるので、それについてはまた別のタイミングで書きます。
さいごに
使ってると色々問題にブチ当たって解決していくかと思います。
これからも継続的にアウトプットしていこうかと思います。
尚、私の花粉症アウトプットは今のところ、くしゃみのみです。
それでは。