从无服务器的安装到Lambda的部署

首先

使用Serverless框架来开发无服务器应用程序(以下简称SLA),从创建在AWS Lambda上运行的基于nodejs的函数到部署完成。由于觉得官方的快速启动功能不尽如人意,所以我写下了这篇备忘录。

为什么在SLA开发中要使用框架?

代码的更改可以在本地完成,构建可以在EC2或Docker上进行,部署可以使用S3,处理程序的设置可以使用Lambda,API的设置可以使用API Gateway,日志的确认可以使用CloudWatch。由于这样的开发流程很繁琐,我认为最好是自己搭建开发环境或使用框架。

如果是一个小型应用程序,或者只需要写一次就完成的话,可能只需要使用Lambda的内联编辑器和测试功能就可以满足需求。但是,如果应用程序变得稍大一些,或者想要做一些复杂的事情,由于SLA开发的特性和Lambda的限制,CI/CD的成本会大幅增加。例如,

    • コード中で外部のパッケージを利用する場合、デプロイが辛くなる。関数ファイルと外部パッケージをzipしてLambdaにアップロードする必要がある

 

    • その場合、Lambdaと開発環境をそろえようと思うと、EC2やDockerを利用することになる

 

    • アップロードするzipファイルサイズが3MBを越えた場合、インラインエディタで編集できなくなる

 

    zipファイルサイズが10MBを越えた場合、コードを変更するたびにzipファイルをS3にアップロード -> S3からLambdaにインポートという手順を踏む必要がある

使用无服务器架构

sls deployコマンドだけでデプロイができる
裏側でCloudFormationのスタックを利用することによって、S3とLambdaのコードの管理だけでなく、APIやデータベースの設定も一括してやってくれるので、開発に一貫性が生まれる

我认为有这个好处。

水流。

    • IAM Policyの作成

 

    • IAM Userの作成

 

    • .aws/credentialsの編集

 

    • Serverlessのインストール

 

    • serverless.ymlの編集

 

    デプロイ

首先,Serverless项目需要具备AWS上服务的权限。必须将拥有所需权限集的AWS用户(IAM用户)的凭据与项目相关联。这涉及到创建IAM策略和IAM用户。

接下来,由于不希望在 serverless.yml 文件中直接写入凭证信息,我们将凭证信息存放在本地 .aws/credentials 文件中进行管理。

然后,在 serverless.yml 文件中设置参考 .aws/credentials 内的所需凭证。此外,还需进行一些其他设置,如 AWS 区域、函数名称、nodejs 版本,并进行部署。

请注意

    • 公式のQuick startにある設定動画は古いし、ちゃんとしてないのであてにならない

 

    AdministratorAccessを献上する必要はない

使用IAM创建自定义策略

在Github上的Serverless Quick Start指南中,建议设置具有AdministratorAccess策略的IAM用户凭据,但是放弃AdministratorAccess并不是一个好主意。在其他地方,官方也有以下表述。

在生产环境中,我们建议将框架使用的IAM用户的权限降低。不幸的是,框架的功能发展非常快,我们还无法为您提供其所需权限的确定集合(我们正在努力解决这个问题)。如果您无法获得对组织主要AWS账户的权限,请考虑在此期间使用一个独立的AWS账户。

这一次虽然不会严格管理,但会相对AdministratorAccess有所限制,并为Lambda部署创建足够定制的策略。如果使用AWS的其他服务,则会根据需要添加相应的行动。

通过AWS控制台,
IAM
-> 策略
-> 创建策略
-> JSON标签
然后进行以下更改。对于S3、Lambda等服务,限制服务,但对于每个服务的动作不进行限制,使用通配符。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt20180730",
            "Effect": "Allow",
            "Action": [
                "s3:*",
                "logs:*",
                "iam:*",
                "apigateway:*",
                "lambda:*",
                "cloudformation:*",
                "events:*"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

为了使“Sid”更容易识别,可以随意输入任意ID。如果希望更加严格的话,可以进一步限定“Action”和“Resource”。但对于个人使用来说,感觉这样管理起来更方便易行。

– 回顾政策
– 在 “Name” 中输入 “ServerlessFrameworkBasic”
– 点击 “Create policy” 完成。

创建 IAM 用户

在AWS控制台中:
IAM
-> 用户
-> 在用户名处输入my-app-user
-> 勾选启用编程访问
-> 下一步:权限
-> 直接附加现有策略
-> 在策略中搜索并选择先前创建的ServerlessFrameworkBasic,左侧勾选策略名
-> 下一步:审查
-> 创建用户
-> 下载.csv文件以备用凭证

这里显示的访问密钥ID和密钥将在稍后使用。

编辑.aws/credentials

Note: The paraphrase is provided in simplified Chinese.

使用文本编辑器将创建的IAM用户凭证添加到本地的~/.aws/credentials。如果不存在,将进行创建。虽然似乎可以使用serverless命令进行插入,但不建议直接将访问密钥放入命令中。

[任意のプロファイル名]
aws_access_key_id = 先程のAccess key IDをここに入れる
aws_secret_access_key = 先程のSecret access keyをここに入れる

例如,情况会成为这样。如果已经存在其他凭据,我们不会覆盖它们,而是会进行追加。

[default]
aws_access_key_id = ...
aws_secret_access_key = ...

[my-app-user]
aws_access_key_id = 1234567890ABCDEFGHIJ
aws_secret_access_key = 1234567890abcdefghijklmnopqrstuvwxyzABCD

[another-credential]
aws_access_key_id = ...
aws_secret_access_key = ...

只要使用AWS CLI,并且所使用的配置文件与AWS CLI中默认使用的配置文件不同,请注意。作为参考,官方有如下说明。

请注意!由于AWS IAM和本地环境的工作方式,如果您使用CLI命令serverless invoke local -f …本地调用Lambda函数,IAM角色/配置文件可能会与在serverless.yml配置文件中设置的角色/配置文件不同。因此,很可能会使用不同的权限集,从而改变Lambda函数与其他AWS资源之间的交互。

安装Serverless并创建项目。

假设你已经安装了Node.js。截至2018年7月30日,AWS Lambda主要支持Node.js的版本是6.10和8.10,所以建议安装8.10版本,这样你就可以在Node控制台上尝试一些简单的操作,非常方便。本次的serverless安装是全局的,项目的根目录将在主目录下创建。

npm i -g serverless
# cd ~ && sls create -t aws-nodejs -p プロジェクト名
cd ~ && sls create -t aws-nodejs -p my-app

当查看项目的根目录时,我相信您会确认存在handler.js和serverless.yml文件。

ls ~/my-app
# => handler.js     serverless.yml

编辑 serverless.yml

以下是最低限必要的描述。建议您查看Serverless.yml的参考文档。

service:
  name: プロジェクト名

provider:
  name: aws
  runtime: nodejsのバージョン
  profile: credentialのプロファイル名
  region: リージョン

functions:
 関数名:
    handler: handler.関数名

例如,
– 项目名称为my-app。
– 使用先前创建的my-app-user凭据。
– Lambda的nodejs版本为8.10。
– 拥有以下类似的handler.js文件。

'use strict';

module.exports.main = (event, context, callback) => {
  const response = {
    statusCode: 200,
    body: JSON.stringify({
      message: 'Go Serverless v1.0! Your function executed successfully!',
      input: event,
    }),
  };

  callback(null, response);
};

如果假设如下,那么serverless.yml的结构将如下所示。

service:
  name: my-app

provider:
  name: aws
  runtime: nodejs8.10
  profile: my-app-user
  region: ap-northeast-1

functions:
  main:
    handler: handler.main

需要注意的地方是:
– stage是默认设置为dev。在部署时,Lambda函数的名称会在函数名后缀加上stage名。
– nodejs的版本默认是6.10,如果要使用8.10版本,请确保没有误修改。
– region默认为us-east-1区域。在部署时,CloudFormation的Stack会在us-east-1区域创建,所以如果要使用的区域不是us-east-1,需要正确指定,否则可能会发生错误。

部署

cd ~/my-app
sls deploy -v

目前来看,无论是否使用v(verbose)选项,输出并没有太大的差异,所以我认为只用sls deploy即可,但如果想要确认Starck Outputs,也可以添加它。

提供参考

https://github.com/serverless/serverless可以用来构建无服务器应用程序。
https://serverless.com/framework/docs/providers/aws/guide/serverless.yml/ 是一个指南,可以帮助你使用Serverless框架在AWS上编写serverless.yml文件。

广告
将在 10 秒后关闭
bannerAds