从无服务器的安装到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文件。