我正在尝试用 Python 为我的 Web 服务编写 API 测试。我想避免使用我的 AWS Cognito 池中测试用户的密码。我对此的策略(如果有更好的方法请告诉我)是要求 API 测试以 Cognito 管理员权限运行。然后使用 boto3 库为用户获取 JWT AccessToken,我将其添加到 API 测试的每个请求的标头中。
该文档似乎没有给我一种获取 AccessToken 的方法。我想在这里使用它:https : //boto3.amazonaws.com/v1/documentation/api/latest/reference/services/cognito-idp.html#CognitoIdentityProvider.Client.admin_initiate_auth
admin_initiate_auth 需要三种身份验证模式之一。USER_PASSWORD_AUTH 需要密码,USER_SRP_AUTH 需要客户端密码,CUSTOM_AUTH 需要密码哈希。我希望找到一种编写此脚本的方法,以便我只需要拥有正确的 IAM 权限,而无需签入公共测试用户密码。
或者...我猜...被告知这不是一个很好的方式来做这件事,而另一种方式更合适。最终目标是对 Cognito 保护的服务进行 API 黑盒测试。
我正在尝试按照教程部署一个 chalice 应用程序。我在 python3.6 中使用 virtualenv。我的应用程序依赖于 requirements.txt 中的 github 存储库,而该存储库的 requirements.txt 依赖于多个库。
我可以很好地运行应用程序,python -i app.py并且可以在 REPL 中正确执行我的端点。
但是,当我运行时,chalice deploy我收到一个错误,抱怨我需要的 github 存储库所需的模块。
File "/usr/local/lib/python2.7/dist-packages/chalice/deploy/packager.py", line 715, in download_all_dependencies
raise NoSuchPackageError(str(package_name))
NoSuchPackageError: Could not satisfy the requirement: PyQt5>=5.8.1
Run Code Online (Sandbox Code Playgroud)
但是请注意,使用的这个 chalice 库是 2.7。我在一个设置为 python3.6 的 virtualenv 中。
我意识到我之前在全局安装了 chalice,这可能是一个错误。所以我 pip 全局卸载了 chalice,但它仍然安装在我的 virtualenv 中。
现在重新运行圣杯,我得到
$ chalice --version
bash: /usr/local/bin/chalice: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我尝试将 chalice 的安装重新运行到本地 virtualenv,但它没有改变任何东西。
我在这里做错了什么?
我在 AWS Route53 中注册了一个带有 ACM 证书的域名。我现在正在尝试将该域名和证书移动到一个新帐户,并使用 Terraform 管理资源。我使用 AWS CLI 将域名移动到新帐户,它似乎运行良好。然后我尝试运行这个 Terraform 代码来为域创建一个新的证书和托管区域。
resource "aws_acm_certificate" "default" {
domain_name = "mydomain.io"
validation_method = "DNS"
}
resource "aws_route53_zone" "external" {
name = "mydomain.io"
}
resource "aws_route53_record" "validation" {
name = aws_acm_certificate.default.domain_validation_options.0.resource_record_name
type = aws_acm_certificate.default.domain_validation_options.0.resource_record_type
zone_id = aws_route53_zone.external.zone_id
records = [aws_acm_certificate.default.domain_validation_options.0.resource_record_value]
ttl = "60"
}
resource "aws_acm_certificate_validation" "default" {
certificate_arn = aws_acm_certificate.default.arn
validation_record_fqdns = [
aws_route53_record.validation.fqdn,
]
}
Run Code Online (Sandbox Code Playgroud)
这有两件事很奇怪。首先,证书已创建,但验证从未完成。它仍处于等待验证状态。我在此失败后在某处读到您无法自动验证,您需要手动创建 CNAME 记录。所以我进入控制台并单击“将 cname 添加到路由 53”按钮。这将 CNAME 记录适当地添加到 Terraform 创建的新 Route53 记录中。但它已经等待了几个小时。我多次点击同一个按钮,只创建了一个 CNAME,后续点击无效。
另一个奇怪的,也许是一个线索,是我的网站仍在运行。我相信这应该会破坏网站,因为该域现在由一个新帐户拥有,路由到该新帐户上的不同托管区域,并且有一个现在仍在等待中的证书。但是,一切仍然正常。所以我认为旧证书和托管区域可能会影响这一点。他们是否需要释放域,我是否需要删除该证书?删除旧帐户上的证书听起来没有必要。我不应该再被放弃了。
我还没有将证书与我打算做的 …
我正在使用 Amazon Web Services 并尝试在由 Lambda 触发的集群上运行 ECS 任务定义。
当我在 ECS 控制台中手动运行此任务并选择传递给 run_task 的所有相同选项时,它运行得很好。我在 Cloudwatch 中看到日志,并且任务(更新数据库)的效果已按预期发生。但是,当我从 Lambda 运行该任务时,它不起作用,但也没有给出任何我能看到的错误。
这是 Lambda 定义:
import boto3
def lambda_handler(event, context):
print("howMuchSnowDoUpdate")
client = boto3.client('ecs')
response = client.run_task(
cluster='HowMuchSnow',
taskDefinition='HowMuchSnow:2',
count=1,
launchType='FARGATE',
networkConfiguration={
'awsvpcConfiguration': {
'subnets': [
'subnet-ebce7c8c',
],
'securityGroups': [
'sg-03bb63bf7b3389d42',
],
'assignPublicIp': 'DISABLED'
}
},
)
print(response)
Run Code Online (Sandbox Code Playgroud)
我已为 Lambda 的 IAM 角色授予 ECSFull 策略。在此之前,我在运行 run_task 时收到了预期的权限被拒绝的信息。但是,一旦我添加了该策略,Lambda 就运行得很好,没有报告任何错误,这是我从 print(response) 行得到的响应:
{'tasks': [{'taskArn': 'arn:aws:ecs:us-east-1:221691463461:task/10b2473f-482d-4f75-ab43-3980f6995b17', 'clusterArn': 'arn:aws:ecs:us-east-1:221691463461:cluster/HowMuchSnow', 'taskDefinitionArn': 'arn:aws:ecs:us-east-1:221691463461:task-definition/HowMuchSnow:2', 'overrides': {'containerOverrides': [{'name': 'HowMuchSnow'}]}, 'lastStatus': 'PROVISIONING', 'desiredStatus': …Run Code Online (Sandbox Code Playgroud) 我似乎无法让默认排序工作。对于文档中的论点custom-sort,我只能看到它是一个“用于对项目进行排序的函数”,但我不知道以什么方式。我可以想象很多。是否要求进行初始排序?它似乎返回了一个项目列表,但是当我尝试创建一个项目时,我收到一条错误消息。this.customSort is not a function
<template>
<v-data-table
:headers="headers"
:items="reports"
hide-default-footer>
<template v-slot:item.requested="{ item }">
{{ datetimeToDistance(item.requested) }}
</template>
</v-data-table>
</template>
<script>
export default {
name: 'Reports',
data () {
return {
customSort: (items,index,isDesc) => console.log("never called"),
reports: [{name:"a",requested:"2020-01-01T00:00:00Z"}.{name:"b",requested:"2020-02-02T00:00:00"}],
}
},
computed: {
headers () {
return [
{text: "Name", value: "name"},
{text: "Report Type", value: "report_type"},
{text: "Requested", value: "requested", sort: (a,b) => a.localeCompare(b) },
];
},
}
}
</script>
Run Code Online (Sandbox Code Playgroud)
如果您单击链接,我的排序就有效。我真正想要在这里说的是:“当页面第一次加载时,按‘请求’排序,就像用户最初点击那个一样。然后让他们改变顺序。”
注意:这datetimeToDistance只是一个调用库的函数,并不太重要。只是该列的输出不直接在对象中。
这是来自我编写的程序,我不知道为什么这是真的。
user=> (defn isClose [t1] (fn [t2] (and (<= (- t1 t2) 20)) (<= (- t2 t1) 20)))
#'user/isClose
user=> ((isClose 50) 10)
true
Run Code Online (Sandbox Code Playgroud)
这不就减少到这个程度了吗?
user=> (and (<= 40 20) (<= -40 20))
false
Run Code Online (Sandbox Code Playgroud) boto3 ×2
amazon-ecs ×1
aws-lambda ×1
chalice ×1
clojure ×1
python ×1
terraform ×1
vue.js ×1
vuejs2 ×1
vuetify.js ×1