Tìm kiếm sự kiện EIP bị release bằng cách sử dụng Athena
Bài toán:
- Bạn muốn sử dụng Athena để query log CloudTrail tìm sự kiện EIP bị release: https://docs.aws.amazon.com/athena/latest/ug/cloudtrail-logs.html
=> Vấn đề:
+) có thể thực hiện query giá trị requestParameters theo event name là ReleaseAddress. Tuy nhiên, event này không bao gồm địa chỉ IP, mà chỉ có giá trị allocationId. Vì vậy, để có thể biết được IP nào bị xóa, lại phải tiếp tục thực hiện query giá trị responseElements theo event name là AllocateAddress để xem giá trị publicIp là gì, rồi kiểm tra xem publicIp đó có phải EIP mà KH muốn tìm kiếm không.
>> Redshift – xem cluster resize status
>> Sử dụng toàn bộ đám mây sẽ mở ra một thế giới khả năng mới
+) giá trị requestParameters và responseElements đang được define là string, nhưng khi select, trả về lại có dạng json object dạng như sau:
– requestParameters của event ReleaseAddress:
{"allocationId":"eipalloc-0138adfc9be9cd0d9","networkBorderGroup":"ap-northeast-1"}
– responseElements của event AllocateAddress:
{"requestId":"6cc2f1e5-738c-48b4-96ad-b57b068349ac","publicIp":"xx.79.xx.21","domain":"vpc","allocationId":"eipalloc-0138adfc9be9cd0d9","publicIpv4Pool":"amazon","networkBorderGroup":"ap-northeast-1"}
Vì vậy, việc trích xuất giá trị allocationId, rồi lại map lại để tìm ra publicIp là khá khó khăn.
Cách thực hiện:
Cách 1:
Khi column có kiểu chuỗi như là responseElements/requestParameters mà bạn đã chỉ ra đang được bao gồm trong record, thì sẽ có các cách có thể xem xét như sử dụng LIKE [1] bằng câu lệnh where để chỉ định record bao gồm chuỗi kí tự xác định, hoặc là sử dụng function json_parse và json_extract_scalar [2] để truy xuất element cần thiết từ giá trị đã phân tích/parse từ string thành json rồi chỉ định.
Cụ thể thì cũng chỉ là một ví dụ, nhưng ví dụ có cách chỉ định câu lệnh where bằng cách như dưới đây.
# Truy xuất cái đang bao gồm chuỗi kí tự cụ thể bằng LIKE
ーー
select * from “tbl_name” where “eventname” = ‘AllocateAddress’ and “responseElements” like ‘%XX.XX.XX.XX%’ limit 1
ーー
# Phân tích/parse string thành json
ーー
select * from “tbl_name” where “eventname” = ‘AllocateAddress’ and json_extract_scalar(json_parse(“responseElements”),’$.publicIp’) = ‘XX.XX.XX.XX’ limit 1
ーー
Vì vậy, chúng tôi sẽ đánh giá cao nếu bạn có thể thử các cách trên để xem liệu có thể đáp ứng được mong muốn của bạn hay không.
Tài liệu tham khảo:
[1] SELECT – Amazon Athena
https://docs.aws.amazon.com/ja_jp/athena/latest/ug/select.html
ーー
[NOT] LIKE value – 指定したパターンを検索します。次の例のように、パーセント記号 (%) をワイルドカード文字として使用します。
ーー
[2] 6.12. JSON Functions and Operators — Presto 0.217 Documentation
https://prestodb.io/docs/0.217/functions/json.html
ーー
json_parse(string) → json
Returns the JSON value deserialized from the input JSON text. This is inverse function to json_format():
ーー
json_extract_scalar(json, json_path) → varchar
Like json_extract(), but returns the result value as a string (as opposed to being encoded as JSON). The value referenced by json_path must be a scalar (boolean, number or string):
ーー
=> Cách làm:
Để tìm kiếm sự kiện release EIP trên Athena, bạn cần tìm kiếm theo CloudTrail event name [ReleaseAddress].
Tuy nhiên tại event [ReleaseAddress] chỉ có thông tin [Allocation ID] của EIP, mà không có thông tin IP Address của EIP.
Vì vậy bạn cũng cần phải tìm kiếm thông tin [Allocation ID] theo IP address của EIP mà đã bị release, cụ thể cách làm như sau:
・Step 1: Tìm kiếm thông tin [Allocation ID] của EIP theo IP Address
Bạn có thể tham query sample dưới đây để tìm kiếm thông tin [Allocation ID]
select * from "cloudtrail_logs" where "eventname" = 'AllocateAddress' and eventtime < 'yyyy-mm-dd' and json_extract_scalar(json_parse("responseElements"),'$.publicIp' ) = 'xx.xxx.xxx.xx' limit 1
・Step 2: Tìm kiếm sự kiện release EIP theo [Allocation ID] của EIP.
Từ allocationId (Allocation ID) mà đã get được ở Step 1, bạn hãy tham khảo query sample dưới đây để tìm kiếm sự kiện release EIP nhé
select * from "cloudtrail_logs" where "eventname" = 'ReleaseAddress' and eventtime < 'yyyy-mm-dd' and json_extract_scalar(json_parse("requestParameters"),'$.allocationId' ) = 'eipalloc-xxxxxxxxxxxxxxxxx' limit 1
Lưu ý: Bạn hãy thay đổi giá trị event time [yyyy-mm-dd] thành thời điểm tìm kiếm mà bạn mong muốn
Cách 2:
Hello,
Thank you for contacting Premium Support. apologies for the delay in responding.
My name is Nonsikelelo and I will be assisting you with your case today.
I believe you were trying to query a table you created in your cloud trail, using the documents you stated in your case description. You are also looking for an Athena query that will show you which EIP address has been released. If I have misinterpreted the situation, please correct me.
I looked at your situation and decided to duplicate it in my environment. First, I created the table using the CloudTrail document you mentioned. Then I assigned and elastic IP address in my ec2 and released it. I then went to Athena and used the first select statement you used to query the data. The query was successful but the Elastic IP address that I released was not shown. eventually I was able to get the correct results after using the two methods mentioned below.
Solution to the problem:
you can track your API calls using CloudTrail event history:
- 1. Open the CloudTrail console.
- 2. Choose Event history.
- 3. For Filter, select Event name from the dropdown list.
- 4. For Enter event name, enter the event type that you want to search for. Then, choose the event type.
- 5. For Time range, enter the desired time range that you want to track the event type for.
- 6. Choose Apply.
==============================
You can also track using amazon Athena queries, example:
WITH dataset AS ( SELECT eventsource, eventname, useridentity.sessioncontext.attributes.creationdate, useridentity.sessioncontext.sessionissuer.arn, requestParameters, responseElements FROM cloudtrail_logs12 WHERE eventname = ‘AllocateAddress’ ORDER BY eventsource, eventname ) SELECT json_extract(responseElements, ‘$.allocationId’) id, json_extract(responseElements, ‘$.publicIp’) AS ip FROM dataset
===========================
On the reference section I have provided the AWS document and the video that will help you walk through the two processes mentioned above [1][2]
Things you should always look out before running the query:
1. Make sure that the Eventname is correct, please check the EC2 API documentation to get the correct API call and name for allocating EIP [3]
2. Make sure that the partitions loaded for the table you are using, has event name you are looking for. If you know the time range when you performed those operations, you can then check if the partitions for that day are present in s3 and also loaded to catalog. If they are not loaded, use ALTER TABLE ADD PARTITION to load the partitions.
3. The CloudTrail events usually take around 15-20 minutes to get populated after API call is made.
Hopefully I was able to provide helpful information regarding the problem. Please let me know if you have any additional questions, feel free to add them to the next correspondence and I would be glad to assist you.
==Reference==
[1] https://aws.amazon.com/premiumsupport/knowledge-center/cloudtrail-search-api-calls/
[2] https://aws.amazon.com/premiumsupport/knowledge-center/cloudtrail-track-api/ (There is also a short video on your right hand side, of the document)
[3] https://docs.aws.amazon.com/AWSEC2/latest/APIReference/making-api-requests.html
[4] https://docs.aws.amazon.com/AWSEC2/latest/APIReference/using-cloudtrail.html
[5]https://docs.amazonaws.cn/en_us/athena/latest/ug/extracting-data-from-JSON.html