首页 > 解决方案 > aws lambda 函数和对应的 IAM 角色,用于在 CloudFormation 中停止和启动 EC2 实例

问题描述

我正在尝试启动一个计划实例,该实例将在每天的指定时间停止并启动(在 AWS CloudFormation 模板中)。这是我为 lambda 函数定义的 IAM 角色和策略:

RootRole: 
Type: 'AWS::IAM::Role'
Properties:
  AssumeRolePolicyDocument: 
    Version: 2012-10-17
    Statement:
    - Effect: Allow
      Action:
       - logs:CreateLogGroup  
       - logs:CreateLogStream
       - logs:PutLogEvents

      Resource: arn:aws:logs:*:*:*
    - Effect: Allow
      Action: 
      - ec2:Start*
      - ec2:Stop*
      Resource: "*"

当我创建一个堆栈时,它在控制台中返回一个错误(CREATE_FAILED),状态原因是:

已禁止字段资源(服务:AmazonIdentityManagement;状态代码:400;错误代码:MalformedPolicyDocument;请求 ID:3094b9eb-9f45-4763-8f21-9c3f2496fc52)

在此错误之后,与此角色相关的所有服务都因此错误而失败:

未能创建以下资源:[InternetGateway、SNSTopicNameCreate、LambdaInvocationsAlarm、RootRole、VPC、LambdaInvocationsAnomalyDetector]。. 用户请求回滚。

标签: amazon-web-servicesaws-lambdayamlamazon-cloudformation

解决方案


您的策略似乎将定义信任策略的“承担角色”部分与授予 IAM 角色权限的“策略”部分混淆了。

尝试这个:

AWSTemplateFormatVersion: 2010-09-09

Resources:
  LambdaRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: Lambda-Role
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service: lambda.amazonaws.com
            Action: sts:AssumeRole
      Policies:
        - PolicyName: AllowLogsAndEC2
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - logs:CreateLogGroup
                  - logs:CreateLogStream
                  - logs:PutLogEvents
                Resource: arn:aws:logs:*:*:*
              - Effect: Allow
                Action:
                - ec2:StartInstances
                - ec2:StopInstances
                Resource: "*"

通常,创建策略的最简单方法是复制现有策略并进行细微更改,或者使用 IAM 控制台中的策略编辑器生成您想要的大部分内容。然后,您可以调整它提供的策略。


推荐阅读