使用 Terraform 部署 AWS Lambda 的方法.
我想做的事情。
我想使用Terraform部署AWS Lambda。
我想在本地编辑Lambda源代码,然后验证是否能与AWS协同工作。
必须先了解一些基本概念。
・已创建AWS账号
・已创建AWS IAM用户,并生成了access_key和secret_key
・已安装Terraform
・已安装AWS CLI
・已安装VSCODE(可使用您喜欢的编辑器)
・已安装Python(这次我想使用Python 3.9创建一个简单的lambada函数,但由于源代码非常简单,所以版本无关紧要)
环境
$ terraform -v
Terraform v1.5.5
on windows_amd64
+ provider registry.terraform.io/hashicorp/aws v5.13.1
$ python -V
Python 3.9.13
建立资源
・AWS Lambda函数
・AWS IAM角色
・AWS IAM策略
目录结构
尽可能简洁的源代码架构
root
┣━ lambda
┃ ┗━ test
┃ ┗━ src
┃ ┣━ test_terraform.py
┃ ┗━ test_terraform.zip
┣━ main.tf
┣━ variables.tf
┗━ lambda.tf
– 计划将多个 Lambda 函数的源代码放入 lambda 文件夹中,在 test 文件夹中创建了层级,但您可以根据需要自行更改层级。
– test_terraform.zip 是由 Terraform 执行自动创建的,您不需要自行准备(详细说明将在后文提及)。
源代码的内容
主配置文件
・一般的に,main.tf中写下了一些全局通用的重要设置,例如“AWS提供商的设置”。
・在lambda函数执行时,需要授予权限以向cloudWatch写入日志,我想这次我要授予三个权限。
・为了方便起见,这次将IAM设置放在了main.tf中。也可以单独在iam.tf中进行分离设置,也没问题。
# AWS プロバイダの設定
provider "aws" {
access_key = var.access_key
secret_key = var.secret_key
region = var.region
}
# lambda用Roleの設定
resource "aws_iam_role" "lambda_iam_role" {
name = "terraform_lambda_iam_role"
assume_role_policy = <<POLICY
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "sts:AssumeRole",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Effect": "Allow",
"Sid": ""
}
]
}
POLICY
}
# lambda用Policyの作成
resource "aws_iam_role_policy" "lambda_access_policy" {
name = "terraform_lambda_access_policy"
role = aws_iam_role.lambda_iam_role.id
policy = <<POLICY
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogStream",
"logs:CreateLogGroup",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:*:*"
}
]
}
POLICY
}
variables.tf 变量.tf
・在variables.tf文件中编写适用于所有源的变量。
・将地区设置为东京,但可以根据需要进行更改。
・使用事先生成的access_key和secret_key。
variable "region" {
default = "ap-northeast-1"
}
variable "access_key" {
default = "自分のaccess_key"
}
variable "secret_key" {
default = "自分のsecret_key"
}
匿名函数.tf
在terraform的data中,告诉它本地python源代码的路径,它可以在后续执行terraform plan时将其压缩成zip文件,非常方便!
在terraform应用时,它会将source_code_hash(先前创建的源代码zip文件)上传到lambda中。
# ローカルにあるlambdaのソースコード
data "archive_file" "test_terraform" {
type = "zip"
source_dir = "lambda/test/src"
output_path = "lambda/test/src/test_terraform.zip"
}
# AWSへ作るlambda function
resource "aws_lambda_function" "test_terraform" {
function_name = "test_terraform"
filename = data.archive_file.test_terraform.output_path
source_code_hash = data.archive_file.test_terraform.output_base64sha256
runtime = "python3.9"
role = aws_iam_role.lambda_iam_role.arn
handler = "test_terraform.handler"
}
测试_terraform.py
– 这个测验的内容无所谓,哈哈。
def handler(event, context):
print('test')
return()
使用Terraform创建新的Lambda函数。
为了安全起见,让我们对其进行重新初始化。
terraform init
如果这个出现了,那就成功了吧。
Terraform has been successfully initialized!
下一步,让我们确认一下Terraform的执行计划。
terraform plan
如果存在新的文件或增量或差异,则结果将以这种方式呈现。
Plan: 4 to add, 0 to change, 0 to destroy.
执行 terraform plan 之后,应该会生成一个压缩后的 Python 文件。
terraform apply
据说他成功了!这次是新创建的,所以显示为“添加了4个”,但是未来在反映修正时,应该会变成“更改(增量差异的反映)”或“删除”。
Apply complete! Resources: 4 added, 0 changed, 0 destroyed.
在本地编辑lambda的源代码
我想知道刚才使用terraform创建的lambada函数是否已经正确地纳入了terraform的管理范围,所以我想稍微修改一下test_terraform.py进行测试。
def handler(event, context):
print('test again')
return()
然后,再次执行命令。
terraform plan
有一个变动,他告诉我。
Plan: 0 to add, 1 to change, 0 to destroy.
为了将修改内容部署到AWS上,
terraform apply
你說你要部署一個修改的版本。
Apply complete! Resources: 0 added, 1 changed, 0 destroyed.
结束
辛苦了!我成功完成了这次想做的事情!
・我想要用Terraform部署AWS Lambda
⇒已经成功部署了
・我想要在本地编辑Lambda源代码并验证是否能与AWS互通
⇒能够互通,通过Terraform计划进行管理