-
Notifications
You must be signed in to change notification settings - Fork 0
/
report-generator.yaml
140 lines (124 loc) · 5.27 KB
/
report-generator.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
AWSTemplateFormatVersion: '2010-09-09'
Description: 'This CloudFormation template creates an S3 bucket and a Lambda Function that retrieves information about WorkSpaces and publishes it to a CSV file in the S3 bucket each hour for later retrieval by QuickSight.'
# Template Resources
Resources:
WorkspacesReportBucket:
Type: "AWS::S3::Bucket"
Properties:
BucketName: "workspaces-report-bucket-181017"
LambdaExecutionRole:
Type: "AWS::IAM::Role"
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: "Allow"
Principal:
Service: "lambda.amazonaws.com"
Action: "sts:AssumeRole"
Policies:
- PolicyName: "LambdaExecutionPolicy"
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: "Allow"
Action:
- "logs:CreateLogGroup"
- "logs:CreateLogStream"
- "logs:PutLogEvents"
Resource: "arn:aws:logs:*:*:*"
- Effect: "Allow"
Action:
- "s3:PutObject"
- "s3:GetObject"
Resource:
- !Sub "arn:aws:s3:::${WorkspacesReportBucket}"
- !Sub "arn:aws:s3:::${WorkspacesReportBucket}/*"
- Effect: "Allow"
Action:
- "workspaces:DescribeWorkspaces"
- "cloudwatch:GetMetricStatistics"
Resource: "*"
LambdaFunction:
Type: "AWS::Lambda::Function"
Properties:
FunctionName: 'ws-automation-lambda-csv-report'
Handler: "index.lambda_handler"
Role: !GetAtt LambdaExecutionRole.Arn
Code:
ZipFile: |
import boto3
import csv
import os
from io import StringIO
from datetime import datetime, timedelta
def lambda_handler(event, context):
# Configure WorkSpaces client
workspaces_client = boto3.client('workspaces')
# Obtain information about the WorkSpaces
response = workspaces_client.describe_workspaces()
workspaces = response['Workspaces']
# Create a CSV file in memory
output = StringIO()
writer = csv.writer(output)
writer.writerow(['workspace_id', 'user', 'usage', 'running_mode', 'state'])
# Write data to the CSV
for workspace in workspaces:
workspace_id = workspace['WorkspaceId']
user = workspace['UserName']
usage = get_monthly_usage(workspace_id) # Función personalizada para obtener el uso
running_mode = workspace['WorkspaceProperties']['RunningMode']
state = workspace['State']
writer.writerow([workspace_id, user, usage, running_mode, state])
# Upload the CSV file to S3
s3_client = boto3.client('s3')
bucket_name = os.environ['S3_BUCKET']
s3_client.put_object(Bucket=bucket_name, Key='workspaces_report.csv', Body=output.getvalue())
def get_monthly_usage(workspace_id):
# Configure the CloudWatch client
cloudwatch_client = boto3.client('cloudwatch')
# Get the current date and the date 30 days ago
end_time = datetime.utcnow()
start_time = end_time - timedelta(days=30)
# Get CloudWatch metrics for the UserConnected metric of the WorkSpace
response = cloudwatch_client.get_metric_statistics(
Namespace='AWS/WorkSpaces',
MetricName='UserConnected',
Dimensions=[
{
'Name': 'WorkspaceId',
'Value': workspace_id
},
],
StartTime=start_time,
EndTime=end_time,
Period=3600, # 1-hour period (3600 seconds)
Statistics=['Maximum'] # Get the maximum of the values (1.0 or 0.0)
)
# Calculate the cumulative usage of the last 30 days in hours
total_UserConnected_hours = 0
for data_point in response['Datapoints']:
total_UserConnected_hours += data_point['Maximum'] # Sum the hours where the user was connected
print(f"WorkspaceId: {workspace_id}, TotalUserConnectedHours: {total_UserConnected_hours}")
return total_UserConnected_hours
Runtime: "python3.8"
Timeout: 300
Environment:
Variables:
S3_BUCKET: !Ref WorkspacesReportBucket
LambdaScheduledEvent:
Type: "AWS::Events::Rule"
Properties:
ScheduleExpression: "cron(0 * * * ? *)"
Description: "Run the Lambda function each hour"
State: "ENABLED"
Targets:
- Arn: !GetAtt LambdaFunction.Arn
Id: "TargetFunctionV1"
LambdaInvokePermission:
Type: "AWS::Lambda::Permission"
Properties:
Action: "lambda:InvokeFunction"
FunctionName: !Ref LambdaFunction
Principal: "events.amazonaws.com"
SourceArn: !GetAtt LambdaScheduledEvent.Arn