I had to add lambda/dynamodb functionality to a simple website in just a few hours and was worried I wouldn't have time, but this vid totally saved the day. Everything worked perfectly. Thanks!
I've followed about 6 videos before trying to get this working and was unsuccessful. A couple of things I took away from yours that made it successful for me: - Your attention to detail and explanation of the code was very helpful. - Setting the timeout to longer than 3 seconds I think is the golden thing that puzzled me, other videos didn't advise it, yet I think it helped! - Case sensitivity is important. I named my key productid instead of productId and had to use cloud watch to figure out why mine didn't work. - Not only does it work, I now have a code base as well as a base understanding to keep going. Massive thank you!
Hi bro, excellent video, in the first time, was desperate jejeje, because I changed some variables and put the wrong variables necessary for all the code, also, I could add all tests for every method that you mentioned in the video, was very interesting, because if you don't know how to check the logs in. cloud watch, or you don't the correct syntax to write the dynamodb resources, you always get and internal server error 502. Thanks for this video you won a follower for your channel. Note: I broke my brain, trying to fix all my errors, but this is our world, we try to understand other codes and to practice every day until all are excellent. thanks again and regards.🤓
This was very straightforward and helpful. Thank you! Experimented with stuff and followed along and learned much. Just one thing, your python variable / object naming convention feels like Javascript (camelCase), while in Python the convention is variable_name. So was confused for a short time xD.
I had some problem with the CustomEncoder and had to change this : import json from decimal import Decimal class CustomEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, Decimal): return str(obj) # Convert Decimal to a string return super().default(obj)
Anyone had this error? Cant find a solution, its occurs when i try to use patch method, the value is updated, but the response from the api is 500 [ERROR] UnboundLocalError: cannot access local variable 'response' where it is not associated with a value Traceback (most recent call last): File "/var/task/lambda_function.py", line 46, in lambda_handler return response
Thank you @asfandiyar5829. I wrote the whole code by watch but got Internal Server error . I couldn't recognised error . Thank you for the correct code , it worked for me 😊
Felix - any chance you can share the code repo?? I'm a python noob, and getting intenral server errors when hitting API GW with a 502. Source could be helpful as I troubleshoot what I've done wrong.
Awesome Video , very helpful and the standard of code is also adorable. one request Felix please create a separate playlist for python aws functionalities with the same standard of coding please that would be very helpful to the mass.
Hey Felix, you are doing a great job and thank you for this wonderful tutorial. I coded along with you in this tutorial but after trying to invoke my function via postman, I got a 500, internal server error, however, that is not my most significant concern. How are you able to put all these pieces of code together, how are you able to know where and when to use a particular function, module or class? I understand the basics of python but putting them together to form one big program like what you just did is a nightmare for me. How are you able to write almost 250+ lines of code forming a single program without mistakes? Is there a manual you guys use when coding? what is that cheat code you use bro?
I fixed my internal server error! Turns out my DynamoDB table's partition key was misspelled. I had it as "productid" instead of "productId" (capital i was lowercase i). So for anyone getting a 502 I'd say go back and make sure all the small details are correct...
@@clintonebai1351 let me know how that goes. I’ve also read that Lambda is very particular and will throw a 502 if you have single quotation marks versus double (‘’ vs “”) so that’s worth checking out too
Thanks for making videos for nodejs and lambda function super happy for that, also could you please make videos for js, your videos are great and i want to learn aws with nodejs and not python
This is a great video, super helpful! If I wanted to get all products with color "green", what would the scan body look like? Or would you not use scan for this functionality?
Hi getting [ERROR] KeyError: ‘httpMethod’ …. On post getting a 200 with the healthPath but the above error when trying to retrieve from an existing dynamodb
Thanks for this Felix, could you please create a tutorial to explain the CRUD operations in dybamoDB via Lambda. Querying in dynamoDB seems to a whole subject in itself.
@Felix Yu, this video was really helpful thanks a lot!! I am stuck in integrating my lambda function, dynamodb and api gateway. Are you open to giving feedback on individual questions? Will be easier if I show you my approach and your coffee is on me for sure!
Good night, first good work, I have a doubt I wanted to make a pagination in this model would it be possible for you to show how to do it? I tried to find something and try but I didn't succeed.
Love your video. But i am getting an error. Even I followed everything. Can you please help me out. Error: { "errorMessage": "'httpMethod'", "errorType": "KeyError", "requestId": "7a3b8589-935a-41fe-bd22-5cfade4a3fa3", "stackTrace": [ " File \"/var/task/lambda_function.py\", line 22, in lambda_handler httpMethod = event['httpMethod'] " ] }
Anyone had this error? Cant find a solution, its occurs when i try to use patch method, the value is updated, but the response from the api is 500 [ERROR] UnboundLocalError: cannot access local variable 'response' where it is not associated with a value Traceback (most recent call last): File "/var/task/lambda_function.py", line 46, in lambda_handler return response
It's work very well to me in POSTMAN and Requests in Python, but when I try make a request in my simple web page using Javascrip I'm having a issue call CORS "CORS policy: Request header field acess-control-allow-origin is not allowed by Access-Control-Allow-Headers in preflight response", someone know what is?
hey!! great video this really helped me clear few doubts!! but I am getting this error >>> "errorMessage": "'httpMethod'", "errorType": "KeyError", could you please help?
Having an issue when running the health check on Postman. { "errorMessage": "'httpMethod'", "errorType": "KeyError", "requestId": "f2c90a37-afe5-44f7-99a2-696dd8811efc", "stackTrace": [ " File \"/var/task/lambda_function.py\", line 24, in lambda_handler httpMethod = event[\"httpMethod\"] " ] } Can you please post your code? Because, I don't know what happened with the code.
@Felix Yu Thanks a lot for this video, its really helpful. I am getting an error message as follows; "message": "Missing Authentication Token" any solution on this?
Hey! First of all thank you for a such a great video it really helped me alot:) So when i completed everything i was able to work with the post function after changing json.load to json.loads and the items did reflect i the table but the 'GET' funnctionality is not working. got this error on the postman with error code 502 { "message": "Internal server error" } and then check the cloudwatch log and got the log as below. [ERROR] TypeError: 'NoneType' object is not subscriptable Traceback (most recent call last): File "/var/task/lambda_function.py", line 32, in lambda_handler response = getProduct(event['queryStringParameters']['productid']) Anyone encountered similar problem and was able to navigate through it?
Hi I tried running the code but it shows this error : botocore.exceptions.ClientError: An error occurred (ValidationException) when calling the PutItem operation: One or more parameter values were invalid: Missing the key product_id in the item, and thanks for the tutorial this one helped a lot
I got a error as below when doing the product get method. { "message": "Internal server error" } and then check the cloudwatch log and got the log as below. [ERROR] TypeError: 'NoneType' object is not subscriptable Traceback (most recent call last): File "/var/task/lambda_function.py", line 32, in lambda_handler response = getProduct(event['queryStringParameters']['productid']) thanks for your great class.
I resolved the issue. that's for the input value in Json format. such as the PATCH method to /product can solve the error "Internal server error". wish it can be helpful { "productid": "10001", "updateKey": "price", "updateValue": "1000" }
Used the same code and the same configuration but getting this error [ERROR] KeyError: 'httpMethod' Traceback (most recent call last): File "/var/task/code.py", line 23, in lambda_handler httpMethod = event['httpMethod'] [ERROR] KeyError: 'httpMethod' Traceback (most recent call last): File "/var/task/code.py", line 23, in lambda_handler httpMethod = event['httpMethod']. Logging the event in cloudwatch I am getting this [INFO] 2024-01-12T11:22:01.150Z 12836e18-d826-4cad-8593-20e29a5f7b70 {'productid': '1101', 'color': 'red', 'price': '100'}
I had to add lambda/dynamodb functionality to a simple website in just a few hours and was worried I wouldn't have time, but this vid totally saved the day. Everything worked perfectly. Thanks!
Glad that it helped 👍
I've followed about 6 videos before trying to get this working and was unsuccessful.
A couple of things I took away from yours that made it successful for me:
- Your attention to detail and explanation of the code was very helpful.
- Setting the timeout to longer than 3 seconds I think is the golden thing that puzzled me, other videos didn't advise it, yet I think it helped!
- Case sensitivity is important. I named my key productid instead of productId and had to use cloud watch to figure out why mine didn't work.
- Not only does it work, I now have a code base as well as a base understanding to keep going. Massive thank you!
This is super helpful material. Your level of content and pace are great. Thanks a lot Felix!
Tyty glad that u found it helpful!!
Hi bro, excellent video, in the first time, was desperate jejeje, because I changed some variables and put the wrong variables necessary for all the code, also, I could add all tests for every method that you mentioned in the video, was very interesting, because if you don't know how to check the logs in. cloud watch, or you don't the correct syntax to write the dynamodb resources, you always get and internal server error 502. Thanks for this video you won a follower for your channel. Note: I broke my brain, trying to fix all my errors, but this is our world, we try to understand other codes and to practice every day until all are excellent. thanks again and regards.🤓
This was very straightforward and helpful. Thank you!
Experimented with stuff and followed along and learned much.
Just one thing, your python variable / object naming convention feels like Javascript (camelCase), while in Python the convention is variable_name.
So was confused for a short time xD.
If you are getting internal server error then make sure that the code is correct and that dynamo table name is spelt as productId (capital I not i). If you are getting a 404 not found error then make sure you have spelt your variables correctly. I had PATCH as PACH. I've provided the code written in this tutorial below:
# lambda_function:
import boto3
import json
import logging
from custom_encoder import CustomEncoder
logger = logging.getLogger()
logger.setLevel(logging.INFO)
dynamodbTableName = "product-inventory"
dynamodb = boto3.resource("dynamodb")
table = dynamodb.Table(dynamodbTableName)
getMethod = "GET"
postMethod = "POST"
patchMethod = "PATCH"
deleteMethod = "DELETE"
healthPath = "/health"
productPath = "/product"
productsPath = "/products"
def lambda_handler(event, context):
logger.info(event)
httpMethod = event["httpMethod"]
path = event["path"]
if httpMethod == getMethod and path == healthPath:
response = buildResponse(200)
elif httpMethod == getMethod and path == productPath:
response = getProduct(event["queryStringParameters"]["productId"])
elif httpMethod == getMethod and path == productsPath:
response = getProducts()
elif httpMethod == postMethod and path == productPath:
response = saveProduct(json.loads(event["body"]))
elif httpMethod == patchMethod and path == productPath:
requestBody = json.loads(event["body"])
response = modifyProduct(requestBody["productId"], requestBody["updateKey"], requestBody["updateValue"])
elif httpMethod == deleteMethod and path == productPath:
requestBody = json.loads(event["body"])
response = deleteProduct(requestBody["productId"])
else:
response = buildResponse(404, "Not Found")
return response
def getProduct(productId):
try:
response = table.get_item(
Key={
"productId": productId
}
)
if "Item" in response:
return buildResponse(200, response["Item"])
else:
return buildResponse(404, {"Message": "ProductId: {0}s not found".format(productId)})
except:
logger.exception("Do your custom error handling here. I am just gonna log it our here!!")
def getProducts():
try:
response = table.scan()
result = response["Items"]
while "LastEvaluateKey" in response:
response = table.scan(ExclusiveStartKey=response["LastEvaluatedKey"])
result.extend(response["Items"])
body = {
"products": response
}
return buildResponse(200, body)
except:
logger.exception("Do your custom error handling here. I am just gonna log it our here!!")
def saveProduct(requestBody):
try:
table.put_item(Item=requestBody)
body = {
"Operation": "SAVE",
"Message": "SUCCESS",
"Item": requestBody
}
return buildResponse(200, body)
except:
logger.exception("Do your custom error handling here. I am just gonna log it our here!!")
def modifyProduct(productId, updateKey, updateValue):
try:
response = table.update_item(
Key={
"productId": productId
},
UpdateExpression="set {0}s = :value".format(updateKey),
ExpressionAttributeValues={
":value": updateValue
},
ReturnValues="UPDATED_NEW"
)
body = {
"Operation": "UPDATE",
"Message": "SUCCESS",
"UpdatedAttributes": response
}
return buildResponse(200, body)
except:
logger.exception("Do your custom error handling here. I am just gonna log it our here!!")
def deleteProduct(productId):
try:
response = table.delete_item(
Key={
"productId": productId
},
ReturnValues="ALL_OLD"
)
body = {
"Operation": "DELETE",
"Message": "SUCCESS",
"deltedItem": response
}
return buildResponse(200, body)
except:
logger.exception("Do your custom error handling here. I am just gonna log it our here!!")
def buildResponse(statusCode, body=None):
response = {
"statusCode": statusCode,
"headers": {
"Content-Type": "application/json",
"Access-Control-Allow-Origin": "*"
}
}
if body is not None:
response["body"] = json.dumps(body, cls=CustomEncoder)
return response
########################################################################
# custom_encoder:
import json
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, float):
return float(obj)
return json.JSONEncoder.default(self, obj)
I had some problem with the CustomEncoder and had to change this :
import json
from decimal import Decimal
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Decimal):
return str(obj) # Convert Decimal to a string
return super().default(obj)
Anyone had this error? Cant find a solution, its occurs when i try to use patch method, the value is updated, but the response from the api is 500
[ERROR] UnboundLocalError: cannot access local variable 'response' where it is not associated with a value
Traceback (most recent call last):
File "/var/task/lambda_function.py", line 46, in lambda_handler
return response
Thank you @asfandiyar5829.
I wrote the whole code by watch but got Internal Server error . I couldn't recognised error . Thank you for the correct code , it worked for me 😊
Very nice start-point walkthrough video. Thanks Felix! Way to go!
Thank you!!
Great work, Felix Yu! You successfully explained API Gateway and Lambda in a very detailed way. Thank you.
Thank you 😄
Felix - any chance you can share the code repo??
I'm a python noob, and getting intenral server errors when hitting API GW with a 502. Source could be helpful as I troubleshoot what I've done wrong.
Very helpful and insightful Felix. Thank you for sharing this, very much appreciated.
Glad that it’s helpful :)
Very very helpful tutorial for a beginner.. Thank you so much!
Thee best ever explanation I have saw about this subject.
Glad that u found it helpful :)
got error.
{
"message": "Internal server error"
}
502Bad Gateway. How to resolve this. No errors shown in the log events. Thank you.
did u print out the request event? how did it look like?
Got the same 502 bad gateway {
"Message": "Interval server error"
}
@@FelixYu please help me
@@fitnesswithvaibhav got the same error
I have checked and found it was my mistake
Awesome Video , very helpful and the standard of code is also adorable.
one request Felix
please create a separate playlist for python aws functionalities with the same standard of coding please that would be very helpful to the mass.
glad that its helpful 👍
Hi Felix, Can you please share the code because I'm getting error on my system as "Internal Server Error".
Please share code anyone.
Bro you're a Lambda Beast!!! Alteast to a mere mortal novice!!!!
Thank you and glad that it’s helpful :)
Awesome, thanks for making this video😊
Glad that it’s helpful 👍
Thank you! Lot of value here
Glad that u found it helpful!!
Outstanding video! Thank you.
Glad that u found it helpful 👍
Awesome video... could you please create a video for RDS instead of Dynamodb
Hey Felix, you are doing a great job and thank you for this wonderful tutorial. I coded along with you in this tutorial but after trying to invoke my function via postman, I got a 500, internal server error, however, that is not my most significant concern. How are you able to put all these pieces of code together, how are you able to know where and when to use a particular function, module or class? I understand the basics of python but putting them together to form one big program like what you just did is a nightmare for me. How are you able to write almost 250+ lines of code forming a single program without mistakes? Is there a manual you guys use when coding? what is that cheat code you use bro?
Were you able to resolve the internal server error? The health check works but then I get 502 error when I try the POST request.
I fixed my internal server error! Turns out my DynamoDB table's partition key was misspelled. I had it as "productid" instead of "productId" (capital i was lowercase i). So for anyone getting a 502 I'd say go back and make sure all the small details are correct...
@@andrzejwsol Thanks for the information
I will look at my code again
@@clintonebai1351 let me know how that goes. I’ve also read that Lambda is very particular and will throw a 502 if you have single quotation marks versus double (‘’ vs “”) so that’s worth checking out too
@@andrzejwsol Alright, no worries but Can you share your code with me?
I tried updating using patch and I am getting Internal Server Error message. Wonderful video you put up. It was very helpful
that means there is an error in the lambda function. take a look at cloudwatch and see what the problem is
can you share the code via github?
Thanks for making videos for nodejs and lambda function super happy for that, also could you please make videos for js, your videos are great and i want to learn aws with nodejs and not python
The js video link is in the description!!
This is a great video, super helpful! If I wanted to get all products with color "green", what would the scan body look like? Or would you not use scan for this functionality?
Loved it, thanks
Glad that it’s helpful :)
Hi getting [ERROR] KeyError: ‘httpMethod’ …. On post getting a 200 with the healthPath but the above error when trying to retrieve from an existing dynamodb
when u print out the request event, do u see httpMethod as one of the attributes??
Thanks for this Felix, could you please create a tutorial to explain the CRUD operations in dybamoDB via Lambda. Querying in dynamoDB seems to a whole subject in itself.
Hi Felix Where can i get the lambda function code ??? python script ??
I have a problem that when I make the query the event does not bring the httpMethod and path information, the event comes empty.
Im getting 502 bad gateway in postman with 'internal server error' message, how should I solve this
That means there’s an error in the lambda function. U can check the lambda log and see what the error is
@@FelixYu can you please provide lambda code in description or somewhere
downgrade node 18 to node 16
Can you share the code for the same
Please create tutorials using AWS cdk and boto3.
{
"message": "Internal server error"
}
how to resolve this
Is it better to have CRUD in one api or C R U D in 4 diferents lambdas?
Thank you for this video it's very useful , can you do same one with Redshift Database
@Felix Yu, this video was really helpful thanks a lot!! I am stuck in integrating my lambda function, dynamodb and api gateway. Are you open to giving feedback on individual questions? Will be easier if I show you my approach and your coffee is on me for sure!
Can you make the video for SpringBoot? It would be great help
Good night, first good work, I have a doubt I wanted to make a pagination in this model would it be possible for you to show how to do it? I tried to find something and try but I didn't succeed.
can u plz start classes of python from beginer to advanced level??
My update is failing
I have written the same function as your's can you please share me the right code for Update
What error message are u getting?
Love your video. But i am getting an error. Even I followed everything. Can you please help me out. Error: {
"errorMessage": "'httpMethod'",
"errorType": "KeyError",
"requestId": "7a3b8589-935a-41fe-bd22-5cfade4a3fa3",
"stackTrace": [
" File \"/var/task/lambda_function.py\", line 22, in lambda_handler
httpMethod = event['httpMethod']
"
]
}
PLEASE RESPONSE
ARE YOU THERE ?
Anyone had this error? Cant find a solution, its occurs when i try to use patch method, the value is updated, but the response from the api is 500
[ERROR] UnboundLocalError: cannot access local variable 'response' where it is not associated with a value
Traceback (most recent call last):
File "/var/task/lambda_function.py", line 46, in lambda_handler
return response
It's work very well to me in POSTMAN and Requests in Python, but when I try make a request in my simple web page using Javascrip I'm having a issue call CORS "CORS policy: Request header field acess-control-allow-origin is not allowed by Access-Control-Allow-Headers in preflight response", someone know what is?
Hello sir , please make vidoe that how to insert csv data to dynamodb in serverless framework using lambad in nodejs
Thank you for the tutorial. Can you provide lambda code with gitlab link?
hey!! great video this really helped me clear few doubts!!
but I am getting this error >>>
"errorMessage": "'httpMethod'",
"errorType": "KeyError",
could you please help?
When u log out the whole even object in line 21, how does it look like? Does it show httpMethod as one of its attributes?
@@FelixYu if i print(event) iam getting
{
"key1":"value1",
"key2":"value2",
"key3":"value3"
}
@@Kukshalshrey u needa configure ur lambda with api gateway and then use postman to hit the endpoint. U can’t just hit test in the lambda console
Hi, thank you for this. Could you send or post the text source-code please. Thank.
Where can we find the code?
thanks for this great video... where can I find the code? thanks
will anybody please let me know how much will it cost for this above project in the vedio @Felix YU
Please upload the code also so that we can test it
Having an issue when running the health check on Postman.
{
"errorMessage": "'httpMethod'",
"errorType": "KeyError",
"requestId": "f2c90a37-afe5-44f7-99a2-696dd8811efc",
"stackTrace": [
" File \"/var/task/lambda_function.py\", line 24, in lambda_handler
httpMethod = event[\"httpMethod\"]
"
]
}
Can you please post your code? Because, I don't know what happened with the code.
your event parameter doesnt have a key as "httpMethod". you can pass event[] as a parameter in json.dumps(response) instead of response
When u log out the whole event object in line 21, how does it look like? Does it show httpMethod as one of its attributes?
whre i can get code of this project
@Felix Yu Thanks a lot for this video, its really helpful.
I am getting an error message as follows;
"message": "Missing Authentication Token"
any solution on this?
Did u accidentally enable authentication required in api gateway?
Hi was your issue resolved?
Great video. Thanks....pls I will appreciate if you can share this code. Something like the repo link
did any one got the code? can u share it with me
can i get the code??
Hi Felix, I see 502 bad gateway when call GET /product API. What could I check to solve this error? Thanks.
That means there is an error in ur lambda function. Check the cloudwatch log in the lambda and see what the error is and then resolve it accordingly
@@FelixYu Thanks a lot!
downgrade node 18 to node 16
downgrade node 18 to node 16
{
"message": "Internal server error"
}
getting this error ..
could u please solve it
Bro i am also getting same error i u get any solution please let me know
@@fitnesswithvaibhav any luck?? i'm getting error at response = getProcessDomain(event['queryStringParameters']['process_domain']) line.
Could you please put your code on git and share a link.
Sir can you share your code link
Idk if I saved the code when I did it. Let me check when I get a chance 👍
can you please give the code?
Hi felix , your video in such a helpful can you share these code with me👍👍
Code repo please?
Hey!
First of all thank you for a such a great video it really helped me alot:)
So when i completed everything i was able to work with the post function after changing json.load to json.loads and the items did reflect i the table but the 'GET' funnctionality is not working.
got this error on the postman with error code 502
{
"message": "Internal server error"
}
and then check the cloudwatch log and got the log as below.
[ERROR] TypeError: 'NoneType' object is not subscriptable
Traceback (most recent call last):
File "/var/task/lambda_function.py", line 32, in lambda_handler
response = getProduct(event['queryStringParameters']['productid'])
Anyone encountered similar problem and was able to navigate through it?
Same here
I think you need to replace productid with productId
where is the script
This tutorial is okay for AWS free tier?
Yes, it’s within the free tier limit if don’t run it a lot
@@FelixYu Thanks
Hi I tried running the code but it shows this error :
botocore.exceptions.ClientError: An error occurred (ValidationException) when calling the PutItem operation: One or more parameter values were invalid: Missing the key product_id in the item,
and thanks for the tutorial this one helped a lot
My guess is that ur table has a primary key set to be product_id but u passed in productId in the request?
@@FelixYu yes ! Thank you the problem is solved 🙏🏻
Glad that it’s working now 👍
Can you share your code?
could you please post your code
"message": "Internal server error"
}
plz share the code
I got a error as below when doing the product get method.
{
"message": "Internal server error"
}
and then check the cloudwatch log and got the log as below.
[ERROR] TypeError: 'NoneType' object is not subscriptable
Traceback (most recent call last):
File "/var/task/lambda_function.py", line 32, in lambda_handler
response = getProduct(event['queryStringParameters']['productid'])
thanks for your great class.
I resolved the issue. that's for the input value in Json format.
such as the PATCH method to /product can solve the error "Internal server error". wish it can be helpful
{
"productid": "10001",
"updateKey": "price",
"updateValue": "1000"
}
Glad that u got it to work 👍
Hey! I got the same error and i am not able to resolve it. How did you do it? Thanks:)
Dislike, because you don't share the example code, what I supposed to do, copy it from the video?
Such laziness....
Used the same code and the same configuration but getting this error [ERROR] KeyError: 'httpMethod'
Traceback (most recent call last):
File "/var/task/code.py", line 23, in lambda_handler
httpMethod = event['httpMethod']
[ERROR] KeyError: 'httpMethod' Traceback (most recent call last): File "/var/task/code.py", line 23, in lambda_handler httpMethod = event['httpMethod']. Logging the event in cloudwatch I am getting this [INFO] 2024-01-12T11:22:01.150Z 12836e18-d826-4cad-8593-20e29a5f7b70 {'productid': '1101', 'color': 'red', 'price': '100'}
share the code please it is not working for me get, patch methods. POST and DELETE is working