Skip to content

Commit 15f9fef

Browse files
committed
code style
1 parent 4bc6206 commit 15f9fef

File tree

12 files changed

+130
-113
lines changed

12 files changed

+130
-113
lines changed

serverless/aws/features/encryption.py

Lines changed: 40 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -8,34 +8,34 @@
88

99
class Encryption(Feature):
1010
POLICY = {
11-
"Version": "2012-10-17",
12-
"Statement": [
13-
{
14-
"Sid": "RootPermissions",
15-
"Effect": "Allow",
16-
"Principal": {"AWS": "arn:aws:iam::${aws:accountId}:root"},
17-
"Action": "kms:*",
18-
"Resource": "*",
19-
},
20-
{
21-
"Effect": "Allow",
22-
"Principal": {"Service": "logs.${aws:region}.amazonaws.com"},
23-
"Action": [
24-
"kms:Encrypt*",
25-
"kms:Decrypt*",
26-
"kms:ReEncrypt*",
27-
"kms:GenerateDataKey*",
28-
"kms:Describe*",
29-
],
30-
"Resource": "*",
31-
"Condition": {
32-
"ArnLike": {
33-
"kms:EncryptionContext:aws:logs:arn": "arn:aws:logs:${aws:region}:${aws:accountId}:log-group:/services/${self:service}/*"
34-
}
35-
},
36-
},
37-
],
38-
}
11+
"Version": "2012-10-17",
12+
"Statement": [
13+
{
14+
"Sid": "RootPermissions",
15+
"Effect": "Allow",
16+
"Principal": {"AWS": "arn:aws:iam::${aws:accountId}:root"},
17+
"Action": "kms:*",
18+
"Resource": "*",
19+
},
20+
{
21+
"Effect": "Allow",
22+
"Principal": {"Service": "logs.${aws:region}.amazonaws.com"},
23+
"Action": [
24+
"kms:Encrypt*",
25+
"kms:Decrypt*",
26+
"kms:ReEncrypt*",
27+
"kms:GenerateDataKey*",
28+
"kms:Describe*",
29+
],
30+
"Resource": "*",
31+
"Condition": {
32+
"ArnLike": {
33+
"kms:EncryptionContext:aws:logs:arn": "arn:aws:logs:${aws:region}:${aws:accountId}:log-group:/services/${self:service}/*"
34+
}
35+
},
36+
},
37+
],
38+
}
3939

4040
def __init__(self):
4141
super().__init__()
@@ -45,7 +45,7 @@ def __init__(self):
4545
Enabled=True,
4646
PendingWindowInDays=14,
4747
EnableKeyRotation=True,
48-
KeyPolicy=Encryption.POLICY
48+
KeyPolicy=Encryption.POLICY,
4949
)
5050

5151
self.alias = Alias(
@@ -68,12 +68,20 @@ def pre_render(self, service):
6868
resource.DependsOn = "ServiceEncryptionKeyAlias"
6969

7070
for fn in service.functions.all():
71-
self.key.KeyPolicy["Statement"].append(self.create_log_group_kms_statement("arn:aws:logs:${aws:region}:${aws:accountId}:log-group:/aws/lambda/" + fn.name.spinal))
71+
self.key.KeyPolicy["Statement"].append(
72+
self.create_log_group_kms_statement(
73+
"arn:aws:logs:${aws:region}:${aws:accountId}:log-group:/aws/lambda/" + fn.name.spinal
74+
)
75+
)
7276

7377
for resource in service.resources.all():
7478
if isinstance(resource, LogGroup):
7579
if resource.properties.get("KmsKeyId") is not None:
76-
self.key.KeyPolicy["Statement"].append(self.create_log_group_kms_statement("arn:aws:logs:${aws:region}:${aws:accountId}:log-group:" + resource.LogGroupName))
80+
self.key.KeyPolicy["Statement"].append(
81+
self.create_log_group_kms_statement(
82+
"arn:aws:logs:${aws:region}:${aws:accountId}:log-group:" + resource.LogGroupName
83+
)
84+
)
7785

7886
def create_log_group_kms_statement(self, log_group):
7987
return {
@@ -87,11 +95,7 @@ def create_log_group_kms_statement(self, log_group):
8795
"kms:Describe*",
8896
],
8997
"Resource": "*",
90-
"Condition": {
91-
"ArnLike": {
92-
"kms:EncryptionContext:aws:logs:arn": log_group
93-
}
94-
},
98+
"Condition": {"ArnLike": {"kms:EncryptionContext:aws:logs:arn": log_group}},
9599
}
96100

97101
def enable(self, service):

serverless/aws/functions/dynamodb.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def __init__(
2020
self.maximumRecordAgeInSeconds = maximumRecordAgeInSeconds
2121
self.maximumRetryAttempts = maximumRetryAttempts
2222
self.startingPosition = startingPosition
23-
self.type="dynamodb"
23+
self.type = "dynamodb"
2424

2525
if destinations:
2626
self.destinations = destinations

serverless/aws/functions/generic.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,9 @@ def __init__(
7777

7878
layers.append({"Ref": "PythonRequirementsLambdaLayer"})
7979

80-
self._service.resources.export(self.resource_name() + "ArnOutput", self.name.spinal + "-arn", self.arn(), append=False)
80+
self._service.resources.export(
81+
self.resource_name() + "ArnOutput", self.name.spinal + "-arn", self.arn(), append=False
82+
)
8183

8284
if layers:
8385
self.layers = layers
@@ -224,7 +226,7 @@ def with_vpc(self, security_group_names=None, subnet_names=None):
224226
return self
225227

226228
def with_idempotency(self, table_name=None):
227-
table_name = table_name or f"{self.name.pascal.replace('${sls:stage}', '')}Idempotency-" + '${sls:stage}'
229+
table_name = table_name or f"{self.name.pascal.replace('${sls:stage}', '')}Idempotency-" + "${sls:stage}"
228230

229231
idempotency_table = Table(
230232
TableName=table_name,

serverless/aws/provider.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,8 +150,22 @@ def event_bridge(
150150

151151
return fn
152152

153-
def s3(self, name, description, bucket, event, rules=None, existing=None, handler=None, timeout=None, layers=None, **kwargs):
154-
fn = S3Function(self.service, name, description, bucket, event, rules, existing, handler, timeout, layers, **kwargs)
153+
def s3(
154+
self,
155+
name,
156+
description,
157+
bucket,
158+
event,
159+
rules=None,
160+
existing=None,
161+
handler=None,
162+
timeout=None,
163+
layers=None,
164+
**kwargs,
165+
):
166+
fn = S3Function(
167+
self.service, name, description, bucket, event, rules, existing, handler, timeout, layers, **kwargs
168+
)
155169
self.service.functions.add(fn)
156170

157171
return fn

serverless/aws/resources/dynamodb.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
1-
from troposphere.dynamodb import PointInTimeRecoverySpecification, SSESpecification, GlobalTable, ReplicaSpecification, \
2-
ReplicaSSESpecification, StreamSpecification, GlobalTableSSESpecification
1+
from troposphere.dynamodb import (
2+
PointInTimeRecoverySpecification,
3+
SSESpecification,
4+
GlobalTable,
5+
ReplicaSpecification,
6+
ReplicaSSESpecification,
7+
StreamSpecification,
8+
GlobalTableSSESpecification,
9+
)
310
from troposphere.dynamodb import Table as DynamoDBTable, GlobalTable
411

512
from serverless.aws.iam.dynamodb import (
@@ -38,9 +45,7 @@ def __init__(self, TableName, with_full_access=False, with_read_access=False, is
3845
"PointInTimeRecoverySpecification", PointInTimeRecoverySpecification(PointInTimeRecoveryEnabled=True)
3946
)
4047

41-
super().__init__(
42-
cls(title=TableName.replace("${sls:stage}", "").strip("-"), TableName=TableName, **kwargs)
43-
)
48+
super().__init__(cls(title=TableName.replace("${sls:stage}", "").strip("-"), TableName=TableName, **kwargs))
4449
self.access = None
4550
self.is_global = is_global
4651

@@ -52,7 +57,12 @@ def __init__(self, TableName, with_full_access=False, with_read_access=False, is
5257

5358
def configure(self, service):
5459
if service.regions and self.is_global:
55-
self.resource.Replicas = [ReplicaSpecification(Region=region, PointInTimeRecoverySpecification=self.PointInTimeRecoverySpecification) for region in service.regions]
60+
self.resource.Replicas = [
61+
ReplicaSpecification(
62+
Region=region, PointInTimeRecoverySpecification=self.PointInTimeRecoverySpecification
63+
)
64+
for region in service.regions
65+
]
5666
self.resource.StreamSpecification = StreamSpecification(StreamViewType="NEW_AND_OLD_IMAGES")
5767

5868
if service.has(Encryption):
@@ -62,7 +72,9 @@ def configure(self, service):
6272
sse_kwargs["KMSMasterKeyId"] = EncryptableResource.encryption_key()
6373
else:
6474
for replica in self.resource.Replicas:
65-
replica.SSESpecification = ReplicaSSESpecification(KMSMasterKeyId=EncryptableResource.encryption_alias())
75+
replica.SSESpecification = ReplicaSSESpecification(
76+
KMSMasterKeyId=EncryptableResource.encryption_alias()
77+
)
6678

6779
cls = GlobalTableSSESpecification if self.is_global else SSESpecification
6880
self.resource.SSESpecification = cls(**sse_kwargs)

serverless/aws/resources/iam.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ def __init__(self, RoleName, **kwargs):
1818
)
1919

2020
if "${self:service}" not in RoleName:
21-
self.role.properties.__setitem__("RoleName", str(ResourceName("${self:service}-${sls:stage}-${aws:region}-" + RoleName)))
21+
self.role.properties.__setitem__(
22+
"RoleName", str(ResourceName("${self:service}-${sls:stage}-${aws:region}-" + RoleName))
23+
)
2224

2325
self.policy = PolicyBuilder()
2426

serverless/aws/resources/s3.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,7 @@ def __init__(self, BucketName="${self:service}", domain=None, ForceName=False, *
3737
if ForceName:
3838
final_name = BucketName
3939

40-
bucket.properties.__setitem__(
41-
"BucketName", final_name
42-
)
40+
bucket.properties.__setitem__("BucketName", final_name)
4341

4442
super().__init__(bucket)
4543

serverless/cli.py

Lines changed: 33 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -49,50 +49,49 @@ def replace_variables(variables, string):
4949
@kms.command(name="create")
5050
@click.argument("service")
5151
@click.option("-p", "--path", default=join(getcwd(), "serverless.yml"), type=click.Path(exists=True))
52-
@click.option('-s', '--stage', required=True)
53-
@click.option('-r', '--region', multiple=True)
52+
@click.option("-s", "--stage", required=True)
53+
@click.option("-r", "--region", multiple=True)
5454
def kms_create(service, region, stage, path):
55-
client = boto3.client('kms')
55+
client = boto3.client("kms")
5656

5757
variables = {
58-
"${aws:accountId}": boto3.client('sts').get_caller_identity().get('Account'),
58+
"${aws:accountId}": boto3.client("sts").get_caller_identity().get("Account"),
5959
"${aws:region}": client.meta.region_name,
6060
"${self:service}": service,
61-
"${sls:stage}": stage
61+
"${sls:stage}": stage,
6262
}
6363

6464
POLICY_TEMPLATE = Encryption.POLICY
6565
with open(path, "r") as f:
6666
definition = yaml.load(f, Loader=yaml.Loader)
6767
for fn in definition.get("functions").values():
68-
POLICY_TEMPLATE["Statement"].append({
69-
"Effect": "Allow",
70-
"Principal": {"Service": "logs.${aws:region}.amazonaws.com"},
71-
"Action": [
72-
"kms:Encrypt*",
73-
"kms:Decrypt*",
74-
"kms:ReEncrypt*",
75-
"kms:GenerateDataKey*",
76-
"kms:Describe*",
77-
],
78-
"Resource": "*",
79-
"Condition": {
80-
"ArnLike": {
81-
"kms:EncryptionContext:aws:logs:arn": "arn:aws:logs:${aws:region}:${aws:accountId}:log-group:/aws/lambda/"
82-
+ fn.get("name")
83-
}
84-
},
85-
})
68+
POLICY_TEMPLATE["Statement"].append(
69+
{
70+
"Effect": "Allow",
71+
"Principal": {"Service": "logs.${aws:region}.amazonaws.com"},
72+
"Action": [
73+
"kms:Encrypt*",
74+
"kms:Decrypt*",
75+
"kms:ReEncrypt*",
76+
"kms:GenerateDataKey*",
77+
"kms:Describe*",
78+
],
79+
"Resource": "*",
80+
"Condition": {
81+
"ArnLike": {
82+
"kms:EncryptionContext:aws:logs:arn": "arn:aws:logs:${aws:region}:${aws:accountId}:log-group:/aws/lambda/"
83+
+ fn.get("name")
84+
}
85+
},
86+
}
87+
)
8688

8789
POLICY_TEMPLATE = json.dumps(POLICY_TEMPLATE)
8890

8991
defaults = dict(
9092
Description=f"Encryption Key for {service}",
9193
Tags=[
92-
{
93-
'TagKey': 'SERVICE',
94-
'TagValue': service
95-
},
94+
{"TagKey": "SERVICE", "TagValue": service},
9695
],
9796
)
9897

@@ -101,26 +100,18 @@ def kms_create(service, region, stage, path):
101100
key_id, key_arn = retrieve_key(service)
102101
if not key_id:
103102
logger.info("Master key not found. Creating a new one.")
104-
response = client.create_key(
105-
Policy=replace_variables(variables, POLICY_TEMPLATE),
106-
MultiRegion=True,
107-
**defaults
108-
)
103+
response = client.create_key(Policy=replace_variables(variables, POLICY_TEMPLATE), MultiRegion=True, **defaults)
109104

110105
key_id = response.get("KeyMetadata").get("KeyId")
111106
key_arn = response.get("KeyMetadata").get("Arn")
112107
else:
113108
logger.info("Update key policy")
114-
client.put_key_policy(
115-
KeyId=key_id,
116-
PolicyName="default",
117-
Policy=replace_variables(variables, POLICY_TEMPLATE)
118-
)
109+
client.put_key_policy(KeyId=key_id, PolicyName="default", Policy=replace_variables(variables, POLICY_TEMPLATE))
119110

120111
logger.info(f"Using key: {key_id}")
121112

122113
try:
123-
alias = f'alias/{service}-{stage}'
114+
alias = f"alias/{service}-{stage}"
124115
client.create_alias(
125116
AliasName=alias,
126117
TargetKeyId=key_id,
@@ -133,7 +124,7 @@ def kms_create(service, region, stage, path):
133124
logger.info(f"Replicating key to: {target_region}")
134125
variables["${aws:region}"] = target_region
135126

136-
target_session = boto3.client('kms', region_name=target_region)
127+
target_session = boto3.client("kms", region_name=target_region)
137128

138129
try:
139130
replica = target_session.describe_key(KeyId=key_id).get("KeyMetadata")
@@ -143,20 +134,18 @@ def kms_create(service, region, stage, path):
143134
Policy=replace_variables(variables, POLICY_TEMPLATE),
144135
KeyId=key_id,
145136
ReplicaRegion=target_region,
146-
**defaults
137+
**defaults,
147138
).get("ReplicaKeyMetadata")
148139
logger.info(f"Replicate key created in {target_region}")
149140

150141
logger.info(f"Update key policy in {target_region}")
151142
target_session.put_key_policy(
152-
KeyId=key_id,
153-
PolicyName="default",
154-
Policy=replace_variables(variables, POLICY_TEMPLATE)
143+
KeyId=key_id, PolicyName="default", Policy=replace_variables(variables, POLICY_TEMPLATE)
155144
)
156145

157146
try:
158147
target_session.create_alias(
159-
AliasName=f'alias/{service}-{stage}',
148+
AliasName=f"alias/{service}-{stage}",
160149
TargetKeyId=replica.get("KeyId"),
161150
)
162151
logger.info(f"Created key alias in {target_region}")

serverless/service/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,9 @@ def __str__(self):
127127
def has(self, feature):
128128
return len(list(filter(lambda x: isinstance(x, feature), self.features))) > 0
129129

130+
def get_feature(self, feature):
131+
return next(filter(lambda x: isinstance(x, feature), self.features), None)
132+
130133
@classmethod
131134
def to_yaml(cls, dumper, data):
132135
data.pop("builder", None)

0 commit comments

Comments
 (0)