在本地运行“aws stepfunctions”时如何使用状态机 ASL 文件进行定义

时间:2021-04-22 00:07:13

标签: aws-step-functions aws-sam

AWS var c = document.createElement("canvas") var ctx = c.getContext("2d"); const em = 16; c.width = em; c.height = em; ["\uFFFF", "\uFFFF\uFFFF", "?", "☺", "☹", "?", "☠", "?"].forEach(e => console.log(e + ":using center pixel:" + supports(e) + ",using checksum:" + supports2(e) + ",using toDataURL:" + supports3(e))); //using center pixel detection function supports(e) { let ctx = document.createElement("canvas").getContext("2d"); ctx.fillText(e, -2, 4); return ctx.getImageData(0, 0, 1, 1).data[3] > 0; // Not a transparent pixel } //using checksum method function supports2(e) { //https://en.wikipedia.org/wiki/Specials_(Unicode_block) (NON-Character) var unsupported = ["\uFFFF", "\uFFFF\uFFFF"].map(b => { ctx.clearRect(0, 0, em, em); ctx.fillText(b, 0, em); let d = ctx.getImageData(0, 0, em, em).data let sum = d.reduce((acc, cur) => { return acc + cur }) return sum }); ctx.clearRect(0, 0, em, em); ctx.fillText(e, 0, em); let d = ctx.getImageData(0, 0, em, em).data let sum = d.reduce((acc, cur) => { return acc + cur }) return !unsupported.some(b => b == sum) } //using toDataURL() method function supports3(e) { ctx.clearRect(0, 0, em, em); ctx.fillText(e, 0, em); let emo = c.toDataURL() ctx.clearRect(0, 0, em, em); ctx.fillText('\uFFFF', 0, em); let bad1 = c.toDataURL() ctx.clearRect(0, 0, em, em); ctx.fillText('\uFFFF\uFFFF', 0, em); let bad2 = c.toDataURL() return (emo != bad1) && (emo != bad2) }sam 环境中是否可以使用与 SAM 项目中定义的相同的 json 文件在本地调用 SAM 步骤函数?

我正在尝试在本地调用 AWS“Stock Trade”示例中的示例 step 函数,但提供 .asl.json 文件的 filename 而不是手动重新创建 json(为了 de -引用变量名)并将其粘贴到命令行中。

我有两个必需的 docker 容器正在运行,例如

aws

sam local start-lambda

在单独的 Mac 终端窗口中运行。

步进函数定义在文件docker run -p 8083:8083 amazon/aws-stepfunctions-local

问题是,我能找到的 100% 的指南只是重复了相同的 AWS 示例,该示例通过 stdin 而不是文件名创建状态机。

虽然我找不到任何记录在案的例子,但我凭直觉发现我可以通过使用 statemachine/stock_trader.asl.json 来提供一个 json 文件,例如

--definition file://PATH/FILE

但是,这(自然地)只是插入文字 json 文件...例如,使用变量名称(例如 aws stepfunctions --endpoint http://localhost:8083 create-state-machine \ --definition file://statemachine/stock_trader.asl.json \ --name StockTradingStateMachine --role-arn "arn:aws:iam::012345678901:role/DummyRole" )而不是资源的本地 ARN。

有什么办法可以取消引用json文件中的变量名?还是我们必须手动创建(和维护)重复的 json 文件,并为每个引用的资源手动替换“本地”ARN?

1 个答案:

答案 0 :(得分:0)

我希望有更好的解决方案出现,但这是我目前所做的......

我在 Bash 脚本中调用状态机,它调用 sed 手动将通用模板重写到 json 文件中,参数替换为 bash 脚本中指定的值

这是一个小的单变量示例:

$template_source=template.json 
$sm_actual=ready_to_use.json # a "runable" tmp file with placeholders replaced with actual variable names
$sm_function_tag=REPLACEMENT_TEXT
$sm_name=MyFunctionName
$sm_arn=arn:aws:states:us-east-1:MYACCOUNT:stateMachine:$sm_name

# THIS creates the de-referenced json file
# (can have 5 -e params if replacing 5 placeholders)
sed -e "s/REPLACEME/$sm_function_tag/"  ./statemachine/$template_source > ./statemachine/$sm_actual  || exit 2

# THIS copies the file into a bash variable 
json_text=$(cat ./statemachine/$sm_actual)

# This supplies the de-referenced json file contents to the `--definition` parameter:
aws stepfunctions CMD-INVOKE-UPLOAD-WHATEVER \
  --no-cli-pager \
  --state-machine-arn $sm_arn \
  --role-arn  $sm_role_arn \
  --definition "$json_text" \
  --profile AWS-PROFILE-TO-USE || exit 2