Serverless Frameworkで出たエラーの対処法(ちょっとだけ)

記事タイトルとURLをコピーする

はじめに

花粉がかなり舞って、マスクしてる方多いですよね。僕の周りの方々もくしゃみしたりして大変そうです。
今回はエラー特集と題して、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 deplysls 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

qiita

エラーその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

qiita

番外編:やったほうがいいこと

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の書き方があるので、それについてはまた別のタイミングで書きます。

さいごに

使ってると色々問題にブチ当たって解決していくかと思います。
これからも継続的にアウトプットしていこうかと思います。
尚、私の花粉症アウトプットは今のところ、くしゃみのみです。
それでは。