作者: Jim Wang 公众号: 巴博萨船长

摘要:如何配置aws-cli?如何使用aws-cli来部署lamdba函数的程序包?配置aws-cli时,用户访问权限的策略应该是什么样的?如何创建一个最小访问权限的用户,在保证安全的同时实现lambda程序包的部署?这样的用户的访问策略是什么样的?

Abstract: How to configure aws-cli? How to use aws-cli to deploy lamdba function package? When configuring aws-cli, what should be the user access policy? How to create a user with minimal access rights to complete the lambda package deployment task while ensuring security? What is the access strategy for such users?

作者: Jim Wang 公众号: 巴博萨船长

任务背景

AWS的用户和用户权限可以通过AWS IAM来创建和实现,本文主要尝试的是在IAM中,在为aws cli创建编程访问类型用户时,如果仅用于部署aws lambda函数,那么用户的访问权限应该如何限制。如何在保证安全的下,完成一个最小权限的用户用于部署aws lamdba函数。之所以需要设计一个最小访问权限的用户,是为了以后使用github中的actions实现函数代码的自动持续部署。

准备用户

AWS IAM 提供两种用户访问类型,编程访问类型AWS 管理控制台访问,基本的差别如下,在本文中需要的是编程访问类型,以此类型,我们先创建一个用户,用户名暂定test,在创建用户时,我们先不为其设置访问权限。

  • 编程访问:为 AWS API、CLI、SDK 和其他开发工具启用 访问密钥 ID私有访问密钥
  • AWS 管理控制台访问: 启用密码 、使得用户可以登录到 AWS 管理控制台。

访问策略

AWS IAM提供两种访问策略,托管策略(AWS托管和用户托管)和内联策略。AWS托管策略 是由 AWS 创建和管理的独立策略。这里的独立策略 意味着策略有自己的 Amazon 资源名称 (ARN),其中包含策略名称。自己不能更改 AWS 托管策略中定义的权限。内联策略 是用户自己创建与管理的独立策略,内联策略应该算得上是用户托管策略的一种特殊使用方式,内联策略是嵌入在 IAM 身份(用户、组或角色)中的策略。也就是说,策略是身份的固有组成部分。内联策略与应用它的身份之间维持严格的一对一关系,如果要确保策略中的权限不会无意中分配给预期身份之外的身份,则可使用内联策略。请参看下方三种策略的对比示意图,

我们先看一下AWS托管策略,试着分析一下策略运行的服务是否符合我们对最小用户访问策略的预期。

AWSLambdaFullAccess

为AWS托管策略,该托管策略允许访问18个服务(AWS的服务共计239)。其中包括了,其中针对lambda服务的策略有50个,提供了lambda相关的所有权限,该策略能够最终能够实现使用github的actions来自动持续部署代码的任务需求,但是并不是所要求的最小访问策略。

AWSCodeDeployRoleForLambda

为AWS托管策略,该托管策略允许访问4个服务(AWS的服务共计239)。

  • CloudWatch 仅读
  • Lambda 读写
    • GetAlias 仅读
    • GetProvisionedConcurrencyConfig 仅读
    • UpdateAlias 仅写
  • S3 仅读
  • SNS 仅写
AWSLambdaExecute

为AWS托管策略,主要对S3资源的读写和运行日志CloudWatch Logs的读写访问。

AWSLambdaRole

为AWS托管策略,赋予的是调用invoke函数的权限

AWSLambdaReadOnlyAccess

为AWS托管策略,顾名思义,该策略主要提供的是仅读资源访问权限。

当然涉及lambda函数的权限还有很多,分析相关权限后发现AWS的托管权限,都没有与任务完全匹配的。因为部署lambda函数这个操作,对aws lambda服务这部的权限,至少应该有CreateFunction这个操作的写入权限,和UpdateFunctionCode这个操作的写入权限。另外对于IAM这项服务,也应该至少有ListRoles这个列表读取权限,以这些信息为基础,我们创建一个用户托管策略,该策略名称定为UserCustomDeployLambdaFunctionCode,策略具体内容如下,

UserCustomDeployLambdaFunctionCode
  • IAM 列表
    • ListRoles 所有资源
  • Lambda 仅写
    • CreateFunction 所有资源
    • UpdateFunctionCode 所有资源

该用户策略权限的JSON文件如下,可以直接使用JSON文件来创建该用户托管策略。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"Version": "2020-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"lambda:CreateFunction",
"lambda:UpdateFunctionCode",
"iam:ListRoles"
],
"Resource": "*"
}
]
}

创建这个用户托管策略时,我们没有对资源进行限制。在后期,可以限定访问资源,实现基于资源的用户托管策略。

用户策略限定好之后,就需要给之前创建的test用户添加这个托管策略。添加完策略之后就可以尝试使用aws cli来部署lambda 函数代码了,这也是为了以后使用github actions时需要做的前期准备工作。

配置AWS CLI

使用aws cli之前需要对其进行配置。AWS 的CLI配置官方教程也有介绍,基本上按照官方教程即可完成配置,

1
2
3
4
5
username@mac ~ % aws configure
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: us-west-2
Default output format [None]: json

完成配置后我们就可以准备部署代码了,这里假设,已经使用aws lambda 网页端创建了一个名为test的lambda函数,函数的runtime为Python 3.6。函数的处理程序为lambda_function.lambda_handler,即我们需要创建的py文件为lambda_function.py, 文件内容如下,

1
2
3
4
5
6
7
8
9
import json

def lambda_handler(event, context):
# TODO implement
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}

python文件创建完之后就需要对其进行打包,生成名为test.zip的压缩文档,这个zip压缩文档现在就可以理解为一个程序包。创建程序包相关命令如下,

1
2
3
4
5
6
7
8
username@mac aws-cli-test % nano lambda_function.py
username@mac aws-cli-test % ls
lambda_function.py
username@mac aws-cli-test % zip test.zip lambda_function.py
adding: lambda_function.py (deflated 19%)
username@mac aws-cli-test % ls
lambda_function.py test.zip
username@mac aws-cli-test %

程序包创建结束后,就可以尝试使用aws-cli来部署这个lambda函数的程序包了,相关命令和输出结果如下,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
username@mac aws-cli-test % aws lambda update-function-code --function-name test --zip-file fileb://test.zip    
{
"FunctionName": "test",
"FunctionArn": "arn:aws:lambda:ap-northeast-1:XXXXXXXXXX:function:test",
"Runtime": "python3.6",
"Role": "arn:aws:iam::XXXXXXXXXX:role/service-role/test-role-mu5rmz0t",
"Handler": "lambda_function.lambda_handler",
"CodeSize": 321,
"Description": "",
"Timeout": 3,
"MemorySize": 128,
"LastModified": "2020-09-22T06:02:26.878+0000",
"CodeSha256": "XXXXXXXXXXCCCCCCCCCCCCCCCCCCC/zBBvIU4+1oAzeo=",
"Version": "$LATEST",
"TracingConfig": {
"Mode": "PassThrough"
},
"RevisionId": "87a0f614-401d-420f-a338-78a54bd8ba40",
"State": "Active",
"LastUpdateStatus": "Successful"
}

返回的更新结果为”Successful”,说明更新成功,然后可以在aws lambda网页版的页面上看到更新的lambda函数内容,如下图,

小结

至此,创建一个用户托管策略,来实现一个最小用户访问权限,并使用这样一个用户终端里借助aws-cli实现lambda函数的程序包的部署内容也就结束了。aws lambda也是刚刚开始接触,文中定有不足之处,也希望经验丰富的朋友多多指教,感兴趣的朋友可以关注我的个人公众号一起来讨论学习。


版权声明:
文章首发于 Jim Wang's blog , 转载文章请务必以超链接形式标明文章出处,作者信息及本版权声明。