【问题标题】:aws lambda to create different init script on different ec2 machineaws lambda 在不同的 ec2 机器上创建不同的初始化脚本
【发布时间】:2021-11-15 14:15:27
【问题描述】:

我有一个 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,
)

在这里,我使用简单的 init 脚本在 Windows 实例上创建了一个带密码的用户。但是当我启动一个实例时它非常容易。有时,我应该创建 100 多个具有不同用户数据的实例,这些用户数据正在创建用户。 我可以在 boto3 中使用 MaxCount 简单地创建 100 多个实例。

MaxCount=3

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

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

【问题讨论】:

  • 抱歉,不清楚。那 100 个凭证从何而来?您想启动 100 个 lambda 函数,每组凭据一个,或者您想使用一个 lambda 函数启动所有 100 个实例?
  • 对不起我不清楚的问题。是的,我想使用一个 lambda 函数来启动所有 100 个实例。我也没有办法携带 100 个用户凭据。可以请教一下吗?
  • “用户凭据”是什么意思?您是说运行net user /add 的脚本部分每次都应该提供不同的凭据是的,这将是一个问题,因为您希望在每个 实例上运行相同的用户数据脚本。我建议要么使用 Active Directory(而不是单个用户),要么单独启动每个实例。
  • 是的,它将通过 net user 命令新建用户和密码,这是我脚本的一部分。我的完整脚本将创建用户,然后是用户配置文件,最后将 reg 从模板用户复制到新创建的用户。

标签: amazon-web-services amazon-ec2 aws-lambda boto3


【解决方案1】:

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

  1. 如果您想坚持第一种方法,而不是使用 MaxCount 并在 lambda 处理程序的 init-script 中硬编码凭据,则需要对其进行完全模板化,此外还需要使用 for 循环并迭代某些内容。现在,根据您希望在这 100 个实例上使用相同用户名但使用不同密码的位置:
  • 您可以创建一个函数,通过生成一个随机脚本来简单地创建 100 个不同的密码。为了不丢失这些凭据,另一个函数可以将它们加密存储在 Systems Manager Parameter StoreAWS Secrets Manager 中。
  • 稍微不同的方法是预先生成一个带有您的凭据的 csv 或 json 文件,您可以在该文件上循环并逐行读取它们,以便将它们作为 vars 传递给 init 脚本。您需要确保该文件安全地存储在某处。
  1. 您可以在实例启动后执行此操作,而不是在初始化脚本中创建用户。在这里,您可以根据自己的偏好依赖多种 AWS 服务(例如 OpsWorks),但您可以使用 I would recommend Systems Manager and more specifically the RunCommand 运行 PowerShell 脚本以在实例上本地创建用户。在这里,您需要一个 RunCommand 触发器。

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

  1. 按照 John 在 cmets 中的建议,您可以使用 Active Directory,而不是创建本地用户

  2. 您可以一起废弃凭据并使用 AWS Systems Manager Session Manager 甚至可能使用 HashiCorp Boundary 或类似工具。

【讨论】:

  • 是的,我应该使用 Active Directory 进行用户管理。
猜你喜欢
  • 2015-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-25
  • 2020-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多