[英]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 只是一组命令,而不是系统(应用程序)或计算环境。
我将这个过程分解如下:
据此,我将坚持基于事件的业务逻辑执行的设计模式:
事件源将事件发送到事件总线。 然后 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 的结构:
lambda_role
指的是先前定义的角色。log_retention
3 个月,删除retry_attempts
并设置了 3 min timeout
。 这些是可选的,应根据您的喜好使用/调整。code
是指我将在下一个块中提供的块。 如果您想遵循建议的结构,则需要在项目的根目录中创建名为lambda_code
的目录,在其中您将编写名为lambda_main.py
脚本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.