Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

AttributeError: type object 'Output' has no attribute 'json_dumps' #1436

Open
garyyang6 opened this issue Jun 4, 2023 · 0 comments
Open
Labels
area/examples kind/bug Some behavior is incorrect or out of spec

Comments

@garyyang6
Copy link

What happened?

I use the Pulumi sample code at https://github.com/pulumi/examples/tree/master/aws-py-apigateway-lambda-serverless.

pulumi version v3.69.0 It runs on AWS cloud. I got errors as follows:

main.py", line 49, in body=pulumi.Output.json_dumps({ AttributeError: type object 'Output' has no attribute 'json_dumps'

Expected Behavior

It should create API Gateway with lambda function.

Steps to reproduce

main.py


"""An AWS Python Pulumi program"""
import json
import iam
import pulumi
import pulumi_aws as aws

#region = 'us-west-2'
region = aws.config.region

custom_stage_name = 'example'

##################
## Lambda Function
##################

# Create a Lambda function, using code from the `./app` folder.

lambda_func = aws.lambda_.Function("mylambda",
    role=iam.lambda_role.arn,
    runtime="python3.7",
    handler="hello.handler",
    code=pulumi.AssetArchive({
        '.': pulumi.FileArchive('./hello_lambda')
    })
)


####################################################################
##
## API Gateway REST API (API Gateway V1 / original)
##    /{proxy+} - passes all requests through to the lambda function
##
####################################################################

# Create a single Swagger spec route handler for a Lambda function.
def swagger_route_handler(arn):
    return ({
        "x-amazon-apigateway-any-method": {
            "x-amazon-apigateway-integration": {
                "uri": pulumi.Output.format('arn:aws:apigateway:{0}:lambda:path/2015-03-31/functions/{1}/invocations', region, arn),
                "passthroughBehavior": "when_no_match",
                "httpMethod": "POST",
                "type": "aws_proxy",
            },
        },
    })

# Create the API Gateway Rest API, using a swagger spec.
rest_api = aws.apigateway.RestApi("api",
    body=pulumi.Output.json_dumps({
        "swagger": "2.0",
        "info": {"title": "api", "version": "1.0"},
        "paths": {
            "/{proxy+}": swagger_route_handler(lambda_func.arn),
        },
    }))

# Create a deployment of the Rest API.
deployment = aws.apigateway.Deployment("api-deployment",
    rest_api=rest_api.id,
    # Note: Set to empty to avoid creating an implicit stage, we'll create it
    # explicitly below instead.
    stage_name="",
)

# Create a stage, which is an addressable instance of the Rest API. Set it to point at the latest deployment.
stage = aws.apigateway.Stage("api-stage",
    rest_api=rest_api.id,
    deployment=deployment.id,
    stage_name=custom_stage_name,
)

# Give permissions from API Gateway to invoke the Lambda
rest_invoke_permission = aws.lambda_.Permission("api-rest-lambda-permission",
    action="lambda:invokeFunction",
    function=lambda_func.name,
    principal="apigateway.amazonaws.com",
    source_arn=deployment.execution_arn.apply(lambda arn: arn + "*/*"),
)

#########################################################################
# Create an HTTP API and attach the lambda function to it
##    /{proxy+} - passes all requests through to the lambda function
##
#########################################################################

http_endpoint = aws.apigatewayv2.Api("http-api-pulumi-example",
    protocol_type="HTTP"
)

http_lambda_backend = aws.apigatewayv2.Integration("example",
    api_id=http_endpoint.id,
    integration_type="AWS_PROXY",
    connection_type="INTERNET",
    description="Lambda example",
    integration_method="POST",
    integration_uri=lambda_func.arn,
    passthrough_behavior="WHEN_NO_MATCH"
)

url = http_lambda_backend.integration_uri

http_route = aws.apigatewayv2.Route("example-route",
    api_id=http_endpoint.id,
    route_key="ANY /{proxy+}",
    target=http_lambda_backend.id.apply(lambda targetUrl: "integrations/" + targetUrl)
)

http_stage = aws.apigatewayv2.Stage("example-stage",
    api_id=http_endpoint.id,
    route_settings= [
        {
            "route_key": http_route.route_key,
            "throttling_burst_limit": 1,
            "throttling_rate_limit": 0.5,
        }
    ],
    auto_deploy=True
)

# Give permissions from API Gateway to invoke the Lambda
http_invoke_permission = aws.lambda_.Permission("api-http-lambda-permission",
    action="lambda:invokeFunction",
    function=lambda_func.name,
    principal="apigateway.amazonaws.com",
    source_arn=http_endpoint.execution_arn.apply(lambda arn: arn + "*/*"),
)

# Export the https endpoint of the running Rest API
pulumi.export("apigateway-rest-endpoint", deployment.invoke_url.apply(lambda url: url + custom_stage_name + '/{proxy+}'))
# See "Outputs" for (Inputs and Outputs)[https://www.pulumi.com/docs/intro/concepts/inputs-outputs/] the usage of the pulumi.Output.all function to do string concatenation
pulumi.export("apigatewayv2-http-endpoint", pulumi.Output.all(http_endpoint.api_endpoint, http_stage.name).apply(lambda values: values[0] + '/' + values[1] + '/'))
iam.py
# Copyright 2016-2018, Pulumi Corporation.  All rights reserved.

from pulumi_aws import iam

lambda_role = iam.Role('lambdaRole',
    assume_role_policy="""{
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": "sts:AssumeRole",
                "Principal": {
                    "Service": "lambda.amazonaws.com"
                },
                "Effect": "Allow",
                "Sid": ""
            }
        ]
    }"""
)

lambda_role_policy = iam.RolePolicy('lambdaRolePolicy',
    role=lambda_role.id,
    policy="""{
        "Version": "2012-10-17",
        "Statement": [{
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        }]
    }"""
)

Output of pulumi about

CLI
Version      3.69.0
Go Version   go1.20.4
Go Compiler  gc

Plugins
NAME            VERSION
aws             5.21.1
aws-apigateway  1.0.1
docker          3.1.0
python          unknown

Host
OS       ubuntu
Version  22.04
Arch     x86_64

This project is written in python: executable='/home/ubuntu/work-on-lambda/cloud/deployment/src/alert_notification_lambda/venv/bin/python3' version='3.9.16
'

Current Stack: company/alert-notification-lambda/stage

TYPE                                      URN
pulumi:pulumi:Stack                       urn:pulumi:stage::alert-notification-lambda::pulumi:pulumi:Stack::alert-notification-lambda-stage
pulumi:providers:aws                      urn:pulumi:stage::alert-notification-lambda::pulumi:providers:aws::default_5_21_1
aws:cloudwatch/eventBus:EventBus          urn:pulumi:stage::alert-notification-lambda::aws:cloudwatch/eventBus:EventBus::bus
aws:cloudwatch/eventRule:EventRule        urn:pulumi:stage::alert-notification-lambda::aws:cloudwatch/eventRule:EventRule::rule
aws:apigatewayv2/api:Api                  urn:pulumi:stage::alert-notification-lambda::aws:apigatewayv2/api:Api::example
aws:iam/role:Role                         urn:pulumi:stage::alert-notification-lambda::aws:iam/role:Role::lambda-role
aws:iam/role:Role                         urn:pulumi:stage::alert-notification-lambda::aws:iam/role:Role::api-gateway-role
aws:apigatewayv2/stage:Stage              urn:pulumi:stage::alert-notification-lambda::aws:apigatewayv2/stage:Stage::stage
aws:iam/rolePolicy:RolePolicy             urn:pulumi:stage::alert-notification-lambda::aws:iam/rolePolicy:RolePolicy::lambda-role-policy
aws:apigatewayv2/integration:Integration  urn:pulumi:stage::alert-notification-lambda::aws:apigatewayv2/integration:Integration::integration
aws:apigatewayv2/route:Route              urn:pulumi:stage::alert-notification-lambda::aws:apigatewayv2/route:Route::route
aws:lambda/function:Function              urn:pulumi:stage::alert-notification-lambda::aws:lambda/function:Function::lambda
aws:cloudwatch/eventTarget:EventTarget    urn:pulumi:stage::alert-notification-lambda::aws:cloudwatch/eventTarget:EventTarget::lambda-target
aws:lambda/permission:Permission          urn:pulumi:stage::alert-notification-lambda::aws:lambda/permission:Permission::lambda-permission


Found no pending operations associated with company/stage

Backend
Name           pulumi.com
URL            https://app.pulumi.com/peter
User           peter
Organizations  peter, company

Dependencies:
NAME                   VERSION
boto3                  1.26.146
pip                    22.0.4
pulumi-aws-apigateway  1.0.1
pulumi-docker          3.1.0
python-dotenv          0.21.0
setuptools             58.1.0

Additional context

No response

Contributing

Vote on this issue by adding a 👍 reaction.
To contribute a fix for this issue, leave a comment (and link to your pull request, if you've opened one already).

@garyyang6 garyyang6 added kind/bug Some behavior is incorrect or out of spec needs-triage Needs attention from the triage team labels Jun 4, 2023
@scottslowe scottslowe added area/examples and removed needs-triage Needs attention from the triage team labels Jun 5, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area/examples kind/bug Some behavior is incorrect or out of spec
Projects
None yet
Development

No branches or pull requests

2 participants