通过 Cloudformation 使用函数 URL 部署 AWS Lambda

lxg*_*lxg 6 amazon-web-services aws-cloudformation aws-lambda

几天以来,AWS Lambda 可以直接作为 Web 服务公开,无需 API 网关

\n

通过 UI 控制台设置时效果很好,但我似乎可以\xe2\x80\x99t 使用 Cloudformation 完成它,因为资源策略未附加AuthType: NONE. 如果没有该策略,当我"message": "Forbidden"尝试通过函数 url 访问 Lambda 时,我会从 AWS 获取信息。

\n

我的 Lambda 如下:

\n
exports.handler = async event => {\n    return {\n        statusCode: 200,\n        body: JSON.stringify("Hello World")\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这里\xe2\x80\x99s是CFN模板:

\n
AWSTemplateFormatVersion: "2010-09-09"\n\nParameters:\n  stackName:\n    Type: String\n  lambdaFile:\n    Type: String\n  lambdaBucket:\n    Type: String\n\nResources:\n  lambdaRole:\n    Type: "AWS::IAM::Role"\n    Properties:\n      AssumeRolePolicyDocument:\n        Version: "2012-10-17"\n        Statement:\n          - Action:\n              - "sts:AssumeRole"\n            Effect: "Allow"\n            Principal:\n              Service:\n                - "lambda.amazonaws.com"\n      Policies:\n        - PolicyDocument:\n            Version: "2012-10-17"\n            Statement:\n              - Action:\n                  - "logs:CreateLogGroup"\n                  - "logs:CreateLogStream"\n                  - "logs:PutLogEvents"\n                Effect: "Allow"\n                Resource:\n                  - !Sub "arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/lambda/${stackName}:*"\n          PolicyName: "lambda"\n\n  runtimeLambdaFunction:\n    Type: "AWS::Lambda::Function"\n    Properties:\n      Code:\n        S3Bucket: !Ref lambdaBucket\n        S3Key: !Ref lambdaFile\n      Environment:\n        Variables:\n          NODE_ENV: production\n      FunctionName: !Sub "${stackName}-runtime"\n      Handler: runtime.handler\n      MemorySize: 128\n      Role: !GetAtt lambdaRole.Arn\n      Runtime: "nodejs14.x"\n      Timeout: 5\n\n  lambdaLogGroup:\n    Type: "AWS::Logs::LogGroup"\n    Properties:\n      LogGroupName: !Sub "/aws/${stackName}"\n      RetentionInDays: 30\n\n  runtimeLambdaUrl:\n    Type: "AWS::Lambda::Url"\n    Properties:\n      AuthType: NONE\n      TargetFunctionArn: !Ref runtimeLambdaFunction\n\nOutputs:\n  runtimeLambdaUrl:\n    Value: !GetAtt runtimeLambdaUrl.FunctionUrl\n\n
Run Code Online (Sandbox Code Playgroud)\n

有趣的是,我可以通过 UI 控制台添加策略,然后它就可以工作了。

\n

这里\xe2\x80\x99是CFN部署后函数URL的初始配置屏幕:

\n

在此输入图像描述

\n

这是我按下 \xe2\x80\x9cEdit\xe2\x80\x9d 按钮时看到的内容:

\n

在此输入图像描述

\n

单击 \xe2\x80\x9cSave\xe2\x80\x9d 后,我得到以下内容(注意蓝色框):

\n

在此输入图像描述

\n

另外,当我再次进入 \xe2\x80\x9cEdit\xe2\x80\x9d 模式时,我现在看到以下内容:

\n

在此输入图像描述

\n

之后,可以通过其 URL 访问该函数。

\n

我尝试将该策略添加到我的 CFN 堆栈中,要么独立为AWS::IAM::Policy,但它不是基于资源的策略,也不是作为lambdaRole. 但无论哪种情况,我都可以添加 aPrincipal并且该策略不会产生效果。

\n

有谁知道如何使用函数 URL 为 Lambda 进行纯 Clouformation 部署?或者这是 Cloudformation 和/或 Lambda 中的错误?

\n

Mar*_*cin 5

您的模板缺少AWS::Lambda::Permission,因此它不起作用。您已经根据 AWS 控制台检查知道了应具有哪些权限,因此您必须使用AWS::Lambda::Permission. 这允许您指定FunctionUrlAuthType