aws lambda在不同的ec2机器上创建不同的init脚本



我有一个lambda函数来启动具有以下用户数据的windows EC2实例,并从环境变量收集实例详细信息。

#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import boto3
AMI = os.environ["AMI"]
INSTANCE_TYPE = os.environ["INSTANCE_TYPE"]
KEY_NAME = os.environ["KEY_NAME"]
SUBNET_ID = os.environ["SUBNET_ID"]
REGION = os.environ["REGION"]
ec2 = boto3.client("ec2", region_name=REGION)
def lambda_handler(event, context):
init_script = '''<powershell>$USERNAME="latchu"
$PASSWORD="eM2An@ydxk"
net user /add $USERNAME $PASSWORD</powershell>'''
instance = ec2.run_instances(
ImageId=AMI,
InstanceType=INSTANCE_TYPE,
KeyName=KEY_NAME,
SubnetId=SUBNET_ID,
MaxCount=3,
MinCount=1,
InstanceInitiatedShutdownBehavior="terminate",
UserData=init_script,
)

在这里,我使用简单的初始化脚本在Windows实例上创建一个带有密码的用户。但是当我启动一个实例时就很容易了。有时,我应该用不同的userdata创建100多个实例。我可以在boto3中使用MaxCount简单地创建100多个实例。

MaxCount=3

但是,在我的情况下,每个Ec2实例应该有单独的用户凭据。

所以我想一个lambda函数来处理100多个不同用户数据的实例。我怎样才能做到呢?如有任何帮助,不胜感激。

基本上有两种不同的方法来实现这一点。要么在引导过程中创建用户,要么在实例启动并运行后创建用户。

  1. 如果你想坚持第一种方法,而不是使用MaxCount和在lambda处理程序内的初始化脚本中硬编码凭证,你需要完全模板化它,此外还使用for循环和迭代一些东西。现在,根据您希望在这100个实例中使用相同用户名但使用不同密码的位置:
  • 您可以创建一个函数,通过生成一个随机脚本来简单地创建100个不同的密码。为了不丢失这些凭据,另一个函数可以将它们加密存储在系统管理器参数存储或AWS秘密管理器中。
  • 一个稍微不同的方法是有一个csv或json文件与您的凭据预生成,您可以遍历并逐行读取它们,以便将它们作为变量传递给初始化脚本。你需要确保文件被安全存储在某个地方。
  1. 与其在初始化脚本中创建用户,不如在实例启动后创建用户。在这里,您可以根据您的偏好依赖众多AWS服务(例如OpsWorks),但我建议使用system Manager,更具体地说,是RunCommand,您可以使用它来运行PowerShell脚本以在实例上本地创建用户。这里你需要一个RunCommand的触发器。
  • 一种选择是等待实例可用,并在当前lambda中直接调用RunCommand命令,但这将是次优的,因为它将被证明是昂贵的,并且您很可能会达到15分钟的lambda限制
  • 一个稍微好一点的方法是观察实例创建事件,它将触发RunCommand
  • 第三个选项是对所有带有特定标签(例如PostInstallUserCreation)的实例启动RunCommand

您仍然需要在第二种引导后方法中以某种方式创建或传递凭据,通常您可以使用两种选项的混合,并生成随机字符串以传递给RunCommand(甚至在powershell脚本的实例中本地生成它们)或轮询预先创建并存储在Parameter Store或Secrets Manager中的凭据。

  1. 正如John在评论中建议的那样,你可以选择Active Directory

    而不是创建本地用户
  2. 您可以一起废弃凭据并使用AWS Systems Manager Session Manager甚至可能使用HashiCorp Boundary或类似的工具。

最新更新