使用 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 文件。

image.png
terraform apply

据说他成功了!这次是新创建的,所以显示为“添加了4个”,但是未来在反映修正时,应该会变成“更改(增量差异的反映)”或“删除”。

Apply complete! Resources: 4 added, 0 changed, 0 destroyed.
image.png

在本地编辑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.
image.png

为了将修改内容部署到AWS上,

terraform apply

你說你要部署一個修改的版本。

Apply complete! Resources: 0 added, 1 changed, 0 destroyed.
image.png

结束

辛苦了!我成功完成了这次想做的事情!
・我想要用Terraform部署AWS Lambda
⇒已经成功部署了
・我想要在本地编辑Lambda源代码并验证是否能与AWS互通
⇒能够互通,通过Terraform计划进行管理

广告
将在 10 秒后关闭
bannerAds