Skip to content

Commit 1070b89

Browse files
Passing a logger interface to the handlers (#26)
* freeze recursively request object * pass logger interface to handler * refactor log delivery completely * pass timestamp when publishing log event * support adding filter to log proxy * scrub sensitive info when logging * use string replace all with shim library * ensure s3 fallback logging * fix zip timestamp issue in codegen test * use pip new resolver flag
1 parent 4215ab3 commit 1070b89

File tree

19 files changed

+3687
-2525
lines changed

19 files changed

+3687
-2525
lines changed

.github/workflows/ci.yml

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,19 @@ jobs:
3030
id: install_python
3131
run: |
3232
mkdir "$LOG_PATH"
33-
pip install --upgrade pip setuptools wheel aws-sam-cli -r https://raw.githubusercontent.com/aws-cloudformation/cloudformation-cli/master/requirements.txt
34-
pip install .
33+
pip install --upgrade pip
34+
pip install --use-feature=2020-resolver --upgrade setuptools wheel aws-sam-cli -r https://raw.githubusercontent.com/aws-cloudformation/cloudformation-cli/master/requirements.txt
35+
pip install --use-feature=2020-resolver .
3536
- uses: actions/setup-node@v1
3637
with:
3738
node-version: 12
3839
- name: Install Dependencies Node.js
3940
id: install_nodejs
41+
# Touch needed because of https://github.com/aws/aws-cli/issues/2639
4042
run: |
41-
npm ci --optional && npm run build
43+
npm ci --optional
44+
find ./node_modules/* -mtime +10950 -exec touch {} \;
45+
npm run build
4246
- name: Run Unit Tests
4347
id: unit_testing
4448
run: |

Pipfile.lock

Lines changed: 142 additions & 160 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package-lock.json

Lines changed: 992 additions & 1474 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@
77
"test": "tests"
88
},
99
"files": [
10-
"dist",
11-
"global.d.ts"
10+
"dist"
1211
],
12+
"publishConfig": {
13+
"access": "public"
14+
},
1315
"scripts": {
1416
"build": "npx tsc",
1517
"prepack": "npm run build",
@@ -33,11 +35,11 @@
3335
},
3436
"homepage": "https://github.com/eduardomourar/cloudformation-cli-typescript-plugin#readme",
3537
"dependencies": {
38+
"@org-formation/tombok": "^0.0.1",
3639
"autobind-decorator": "^2.4.0",
3740
"class-transformer": "^0.3.1",
38-
"promise-sequential": "^1.1.1",
3941
"reflect-metadata": "^0.1.13",
40-
"tombok": "https://github.com/eduardomourar/tombok/releases/download/v0.0.1/tombok-0.0.1.tgz",
42+
"string.prototype.replaceall": "^1.0.3",
4143
"uuid": "^7.0.2"
4244
},
4345
"devDependencies": {

python/rpdk/typescript/codegen.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import logging
22
import shutil
3-
import zipfile
3+
import sys
44
from subprocess import PIPE, CalledProcessError, run as subprocess_run # nosec
55
from tempfile import TemporaryFile
66

@@ -13,6 +13,12 @@
1313
from .resolver import contains_model, get_inner_type, translate_type
1414
from .utils import safe_reserved
1515

16+
if sys.version_info >= (3, 8): # pragma: no cover
17+
from zipfile import ZipFile
18+
else: # pragma: no cover
19+
from zipfile38 import ZipFile
20+
21+
1622
LOG = logging.getLogger(__name__)
1723

1824
EXECUTABLE = "cfn"
@@ -173,7 +179,8 @@ def generate(self, project):
173179
def _pre_package(self, build_path):
174180
f = TemporaryFile("w+b")
175181

176-
with zipfile.ZipFile(f, mode="w") as zip_file:
182+
# pylint: disable=unexpected-keyword-arg
183+
with ZipFile(f, mode="w", strict_timestamps=False) as zip_file:
177184
self._recursive_relative_write(build_path, build_path, zip_file)
178185
f.seek(0)
179186

python/rpdk/typescript/templates/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ Congratulations on starting development! Next steps:
1010
Implement CloudFormation resource here. Each function must always return a ProgressEvent.
1111

1212
```typescript
13-
const progress: ProgressEvent = ProgressEvent.builder()
13+
const progress: ProgressEvent = ProgressEvent.builder<ProgressEvent<ResourceModel>>()
1414

1515
// Required
1616
// Must be one of OperationStatus.InProgress, OperationStatus.Failed, OperationStatus.Success
@@ -36,4 +36,4 @@ const progress: ProgressEvent = ProgressEvent.builder()
3636

3737
While importing the [{{ lib_name }}](https://github.com/eduardomourar/cloudformation-cli-typescript-plugin) library, failures can be passed back to CloudFormation by either raising an exception from `exceptions`, or setting the ProgressEvent's `status` to `OperationStatus.Failed` and `errorCode` to one of `HandlerErrorCode`. There is a static helper function, `ProgressEvent.failed`, for this common case.
3838

39-
Keep in mind, during runtime all logs will be delivered to CloudWatch except those used with `debug` method.
39+
Keep in mind, during runtime all logs will be delivered to CloudWatch if you use the `LoggerProxy.log` method.

python/rpdk/typescript/templates/handlers.ts

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
exceptions,
55
handlerEvent,
66
HandlerErrorCode,
7+
LoggerProxy,
78
OperationStatus,
89
Optional,
910
ProgressEvent,
@@ -12,9 +13,6 @@ import {
1213
} from '{{lib_name}}';
1314
import { ResourceModel } from './models';
1415

15-
// Use this logger to forward messages to CloudWatch Logs.
16-
const LOGGER = console;
17-
1816
interface CallbackContext extends Record<string, any> {}
1917

2018
class Resource extends BaseResource<ResourceModel> {
@@ -33,8 +31,9 @@ class Resource extends BaseResource<ResourceModel> {
3331
session: Optional<SessionProxy>,
3432
request: ResourceHandlerRequest<ResourceModel>,
3533
callbackContext: CallbackContext,
34+
logger: LoggerProxy
3635
): Promise<ProgressEvent> {
37-
const model: ResourceModel = request.desiredResourceState;
36+
const model: ResourceModel = new ResourceModel(request.desiredResourceState);
3837
const progress = ProgressEvent.progress<ProgressEvent<ResourceModel, CallbackContext>>(model);
3938
// TODO: put code here
4039

@@ -46,7 +45,7 @@ class Resource extends BaseResource<ResourceModel> {
4645
// Setting Status to success will signal to CloudFormation that the operation is complete
4746
progress.status = OperationStatus.Success;
4847
} catch(err) {
49-
LOGGER.log(err);
48+
logger.log(err);
5049
// exceptions module lets CloudFormation know the type of failure that occurred
5150
throw new exceptions.InternalFailure(err.message);
5251
// this can also be done by returning a failed progress event
@@ -69,8 +68,9 @@ class Resource extends BaseResource<ResourceModel> {
6968
session: Optional<SessionProxy>,
7069
request: ResourceHandlerRequest<ResourceModel>,
7170
callbackContext: CallbackContext,
71+
logger: LoggerProxy
7272
): Promise<ProgressEvent> {
73-
const model: ResourceModel = request.desiredResourceState;
73+
const model: ResourceModel = new ResourceModel(request.desiredResourceState);
7474
const progress = ProgressEvent.progress<ProgressEvent<ResourceModel, CallbackContext>>(model);
7575
// TODO: put code here
7676
progress.status = OperationStatus.Success;
@@ -92,8 +92,9 @@ class Resource extends BaseResource<ResourceModel> {
9292
session: Optional<SessionProxy>,
9393
request: ResourceHandlerRequest<ResourceModel>,
9494
callbackContext: CallbackContext,
95+
logger: LoggerProxy
9596
): Promise<ProgressEvent> {
96-
const model: ResourceModel = request.desiredResourceState;
97+
const model: ResourceModel = new ResourceModel(request.desiredResourceState);
9798
const progress = ProgressEvent.progress<ProgressEvent<ResourceModel, CallbackContext>>();
9899
// TODO: put code here
99100
progress.status = OperationStatus.Success;
@@ -114,8 +115,9 @@ class Resource extends BaseResource<ResourceModel> {
114115
session: Optional<SessionProxy>,
115116
request: ResourceHandlerRequest<ResourceModel>,
116117
callbackContext: CallbackContext,
118+
logger: LoggerProxy
117119
): Promise<ProgressEvent> {
118-
const model: ResourceModel = request.desiredResourceState;
120+
const model: ResourceModel = new ResourceModel(request.desiredResourceState);
119121
// TODO: put code here
120122
const progress = ProgressEvent.success<ProgressEvent<ResourceModel, CallbackContext>>(model);
121123
return progress;
@@ -135,8 +137,9 @@ class Resource extends BaseResource<ResourceModel> {
135137
session: Optional<SessionProxy>,
136138
request: ResourceHandlerRequest<ResourceModel>,
137139
callbackContext: CallbackContext,
140+
logger: LoggerProxy
138141
): Promise<ProgressEvent> {
139-
const model: ResourceModel = request.desiredResourceState;
142+
const model: ResourceModel = new ResourceModel(request.desiredResourceState);
140143
// TODO: put code here
141144
const progress = ProgressEvent.builder<ProgressEvent<ResourceModel, CallbackContext>>()
142145
.status(OperationStatus.Success)

setup.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ def find_version(*file_paths):
4040
install_requires=[
4141
"cloudformation-cli>=0.1.10,<0.2",
4242
"aws-lambda-builders>=0.8,<0.9",
43+
"zipfile38>=0.0.2,<0.2",
4344
],
4445
entry_points={
4546
"rpdk.v1.languages": [

0 commit comments

Comments
 (0)