繁体   English   中英

aws eventbridge 使用 aws-cdk python 将 ssm-document 设置为目标

[英]aws eventbridge set ssm-document as target with aws-cdk python

希望我没有忽略已经存在的答案。我想创建一个 aws-cdk python 堆栈,其中包含一个在触发时启动 ssm 文档的事件。 我在我的 aws 测试帐户中获得了所有想要的东西,事件正在触发所需的操作,并使用正确的目标(由某些标签标识的 ec2 实例)启动 ssm-document/run 命令。 Now when it comes to Iac using aws-cdk python, I came to the boundary that it seems as if the aws_events_targets class ( https://docs.aws.amazon.com/cdk/api/latest/python/aws_cdk.aws_events_targets. html )不允许为事件设置 diesired 目标.. 有没有人建议如何最好地解决这个问题或盲人的正确示例?

使用 AwsApi 目标并通过对 SSM 的 API 调用触发文档。

简而言之,这不是一种有效的方法,因为 ssm-document 只是一组命令,而不是系统(应用程序)或计算环境。

我将这个过程分解如下:

  • 您有一个 ssm-document,应该由 ssm/run-command 使用。 文档本身不做任何事情。
  • 您有一个事件应该触发文档的执行。

据此,我将坚持基于事件的业务逻辑执行的设计模式:

事件源事件发送到事件总线。 然后 EventBridge Rule根据预定义的模式捕获它并激活Lambda ,它将执行一个业务逻辑(在我们的例子中是 ssm-document)。

所以,让我们开始代码:

步骤 0
我假设您已安装 AWS CLI/CDK,已设置项目并且您已登录。

第 1 步 - 声明并定义 Lambda 及其角色

import aws_cdk.aws_iam as _iam

lambda_role = _iam.Role(self, "lambda_role", 
role_name="lambda_role",
assumed_by=_iam.ServicePrincipal("lambda.amazonaws.com"),
managed_policies=[
    _iam.ManagedPolicy.from_aws_managed_policy_name("service-role/AWSLambdaBasicExecutionRole"),
    _iam.ManagedPolicy.from_aws_managed_policy_name("service-role/AWSServiceRoleX"),
    _iam.ManagedPolicy.from_aws_managed_policy_name("AWSRoleY")],
inline_policies={
"My_Custom_Name_For_Inline_Policy": _iam.PolicyDocument(statements=[
    _iam.PolicyStatement(
        effect=_iam.Effect.ALLOW, 
        actions=["ssm:*"],
        resources=["RESOURCE_ARN1", "RESOURCE_ARN1"])])})

由于我没有足够的信息来帮助您正确定义角色,我提出了所有可能的选项,您可以如何允许您的 Lambda function 运行 ssm-document。 以下是一些细节:

  • service-role/AWSLambdaBasicExecutionRole是强制性的
  • service-role/AWSServiceRoleX适用于任何基于服务的 AWS 托管角色。 需要时用正确的替换它。
  • AWSRoleY适用于一般 AWS 托管角色。 需要时用正确的替换它。
  • 我还添加了inline_policies以防您需要详细定义您想要让您的 Lambda 角色执行的操作。
import aws_cdk.aws_lambda as _lambda

lambda_ = _lambda.Function(self, "my_lambda", 
    function_name="my_lambda",
    architecture=_lambda.Architecture.ARM_64,
    runtime=_lambda.Runtime.PYTHON_3_9, 
    role=lambda_role, 
    log_retention=_logs.RetentionDays.THREE_MONTHS,
    timeout=cdk.Duration.minutes(3), 
    retry_attempts=0, 
    code=_lambda.Code.from_asset("./assets/lambda_code/"), 
    handler="lambda_main.lambda_handler")

同样,在这种情况下,我缺少一些信息,但我认为这可能是您的 Lambda function 的结构:

  • 由于我们使用的是 Python3.9 运行时并且我们没有任何复杂的 3rd-party 依赖项 - 我们可以使用ARM 架构
  • lambda_role指的是先前定义的角色。
  • 我还添加了log_retention 3 个月,删除retry_attempts并设置了 3 min timeout 这些是可选的,应根据您的喜好使用/调整。
  • code是指我将在下一个块中提供的块。 如果您想遵循建议的结构,则需要在项目的根目录中创建名为lambda_code的目录,在其中您将编写名为lambda_main.py脚本
  • 将由 Lambda 调用的 function 具有默认名称 - lambda_handler

包含业务逻辑的 Lambda 代码(运行 ssm-document):

import boto3

_ssm = boto3.client('ssm')


def lambda_handler(event, context):
    print(event)
    response = ssm_client.send_command(
                InstanceIds=['i-01234567890'],
                DocumentName="AWS-RunShellScript",
                Parameters={'commands': ['whoami']})

    command_id = response['Command']['CommandId']
    
    return ssm_client.get_command_invocation(CommandId=command_id, InstanceId='i-01234567890')

在此示例中,我决定使用AWS-RunShellScript文档,您应该将其替换为您需要的文档。 默认情况下,参数也应该更改。

第 2 步 - 声明和定义 EventBridge 规则

import aws_cdk.aws_events as _events
import aws_cdk.aws_events_targets as _targets

# Based on CRON
_events.Rule(self, "trigger_rule_sync", 
    rule_name="my_rule_name", 
    enabled=True, 
    schedule=_events.Schedule.cron(minute="0", hour="8"),
    targets=[_targets.LambdaFunction(handler=lambda_tableau_deployment)])

# Based on EVENT PATTERN
_events.Rule(self, "trigger_rule_sync", 
    rule_name="my_rule_name", 
    enabled=True, 
    event_pattern=_events.EventPattern(
        resources=["ARN_OF_MY_CODECOMMIT_REPO"], 
        detail={"event": ["referenceUpdated"], "referenceName": ["prod", "dev"]}),
    targets=[_targets.LambdaFunction(handler=lambda_tableau_deployment)])

在这个片段中,我提供了按计划触发和按事件触发。 作为一个事件,我假设当我通过 AWS CodeCommit 中的 prod 或 dev 分支提交某些内容时,我想触发我的 lambda。 (奇怪,但为什么不呢?)。 代码的详细信息可以在boto3 文档中找到。

第 3 步 - 同步、部署和检查

一切准备就绪后,试一试并验证最终结果是否符合预期。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM