我正在尝试在AWS中创建IAM角色,但在创建时我面临错误
“我们在处理您的请求时遇到以下错误: 附加角色权限时出现问题。未经许可将创建角色。 该策略未能通过传统解析“
{"Version": "2012-10-17", "Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:*:*"
},
{
"Action": [
"sqs:SendMessage",
"sqs:GetQueueUrl"
],
"Effect": "Allow",
"Resource": "arn:aws:sqs:ap-northeast-1:SOME_ID_HERE:test-messages"
}]}
答案 0 :(得分:15)
我收到此错误,无法解决。一位同事和我倒在上面,然后我们发现我留下了一个没有Fn::Sub
的替代变量,例如
"Resource": "arn:aws:logs::${AWS::AccountId}:*
将导致此错误,当然应该是
"Resource": { "Fn::Sub": "arn:aws:logs::${AWS::AccountId}:*" }
顺便说一句,根据我的经验,我同意E.J.上面的Brennan,您不能对区域使用通配符,而应像在此一样将其保留为空白。
答案 1 :(得分:3)
如果您使用的是 serverless
,您可以通过在资源前加上 !Sub
前缀来表明您想要变量替换:
Resource:
- !Sub arn:aws:dynamodb:*:${AWS::AccountId}:table/${self:provider.environment.DYNAMODB_TABLE}
不需要插件(如果无服务器版本是最新的)。
答案 2 :(得分:1)
我今天发现的一个有趣的新错误状态:
如果:
Default
属性提供帐户ID 0
开头 CFN实际上会将参数读取为整数(并将其强制转换为9.3476294382E10)
-无论您在参数上使用Type: String
,还是使用!!str
对其进行显式转换。
因此解决方案是手动向部署提供参数,而不是使用Default: "093476294382"
。
希望我可以节省一些时间。
答案 3 :(得分:1)
为了调试 CloudFormation 语法错误(其中许多错误消息与上述类似),我建议在部署前使用 cfn-lint 进行验证。以后你会感谢我的。
答案 4 :(得分:0)
我不认为你可以在arn上对该区域进行通配,所以你可能需要这样的东西:
arn:aws:logs:us-east-1:*:*
,您可以在其中指定您使用的区域代替我们 - east-1。
此处提供更多信息:
http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#arn-syntax-cloudwatch-logs
答案 5 :(得分:0)
您可能遇到的一个问题是cloudwatch日志ARNS可以有6个符号,因为日志组和日志流之间存在额外的问题。例如:
"Resource": "arn:aws:logs:us-west-2:123456789012:/my/log/group:log-stream"
或您的情况:
"Resource": "arn:aws:logs:*:*:*:*
我发现如果没有添加第6个:某些ARNS(例如上面更具体的示例)会出现此错误。我意识到这确实与文档(包括E.J提供的文档)相矛盾,所以也许它是AWS内部的一个错误
http://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/iam-identity-based-access-control-cwl.html
答案 6 :(得分:0)
我认为你可以做到
"Resource": "arn:aws:logs:us-west-2:123456789012:*"
但如果没有,您可以将帐户映射到具有映射的区域:
"mAWSRegionToAccountsMap": {
"us-west-2": {
"prod": "444444444673",
"dev": "678333333333"
},
"us-gov-west-1": {
"dev": "12345678903",
"prod": "234345345345"
}
}
然后使用":"将映射集成到连接中用于分隔符
"Resource": {
"Fn::Join": [
":",
[
"arn:aws:logs",
{
"Ref": "AWS::Region"
},
{
"Fn::FindInMap": [
"mAWSRegionToAccountsMap", {
"Ref": "AWS::Region"
},
"prod"
]
},
"/*"
]
]
}
可能需要调整结尾
答案 7 :(得分:0)
如果s3失败,请确保您使用的是正确的arn格式:
正确的一个是3 ::: arn:aws:s3 ::: AccountABucketName
“资源”:“ arn:aws:s3 ::: AccountABucketName”
错误2个 :: arn:aws:s3 :: AccountABucketName
“资源”:“ arn:aws:s3 :: AccountABucketName”
答案 8 :(得分:0)
我的问题是我尝试了 class VisitController
{
private function updateVisitors(Visit $visit, Collection $newVisitors): void
{
$newVisitorsPluck = [];
foreach ($newVisitors as $visitor) {
$newVisitorsPluck[$visitor->getId()] = $visitor->getType();
}
$existingVisitors = $visit->Visitors()->pluck('visitor_type', 'visitor_id')->toArray();
$this->deleteRemovedVisitors($visit, $newVisitorsPluck, $existingVisitors);
$this->addNewVisitors($visit, $newVisitorsPluck, $existingVisitors);
}
private function deleteRemovedVisitors(Visit $visit, array $newVisitors, array $existingVisitors): void
{
$deleteItems = array_diff_assoc($existingVisitors, $newAVisitors);
foreach ($deleteItems as $visitorId => $visitorType) {
DB::table('visitors_table')
->where('visit_id', '=', $visit->getKey())
->where('visitor_id', '=', $visitorId)
->where('visitor_type', '=', $visitorType)
->delete();
}
}
private function addNewVisitors(Visit $visit, array $newVisitors, array $existingVisitors): void
{
$addItems = array_diff_assoc($newVisitors, $existingVisitors);
foreach ($addItems as $visitorId => $visitorType) {
$visit->Visitors()->save(
new Visitvisitor([
...
])
);
}
}
}
而不是 "Effect": "ALLOW"
。嗯……