我们有两个账户 111111111111 和 222222222222。
要求 - 账户 111111111111 将每天创建 RDS 快照。拍摄快照后,我们希望账户 111111111111 发布到账户 222222222222 中创建的 SNS 主题。账户 222222222222 收到通知后,它会运行 Lambda 函数。
我已将以下策略附加到帐户 222222222222 中创建的主题
"Sid":"RestoreRDSEng_topic_publish",
"Effect":"Allow",
"Principal":{
"AWS":"111111111111"
},
"Action":"sns:Publish",
"Resource":"arn:aws:sns:us-east-1:222222222222:RestoreRDSEng",
"Condition":{
"StringEquals":{
"AWS:SourceAccount":"222222222222"
},
}
}
Run Code Online (Sandbox Code Playgroud)
当帐户 111111111111 尝试发布到 222222222222 时,我收到以下错误
*“message”:“AuthorizationError:用户:arn:aws:sts ::************假设角色/tf-rds_eventhandler/tf-rds_eventhandler无权执行:SNS:发布于资源:arn:aws:sns:us-east-1:xxxxxxxxxxxx:RestoreRDSEng\n\t状态代码:403,请求 ID:098f4647-c9ad-51fe-9bc3-17b45deef60e"*
问题:
这种做法有什么问题吗?
我是否应该在帐户 222222222222 中创建一个具有对 111111111111 的可信访问权限的角色?
任何其他建议将不胜感激。
AWS 文档提供了不同 SNS 访问控制配置的示例。
类似的配置示例还有两个:
第一个允许将通知从另一个帐户的 S3 存储桶发布到 SNS 主题:
{
"Effect": "Allow",
"Principal": {
"Service": "s3.amazonaws.com"
},
"Action": "sns:Publish",
"Resource": "arn:aws:sns:us-east-2:111122223333:MyTopic",
"Condition": {
"StringEquals": {
"AWS:SourceAccount": "444455556666"
}
}
}
Run Code Online (Sandbox Code Playgroud)
第二个允许将来自另一个帐户的 SES 电子邮件的通知发布到 SNS 主题:
{
"Effect": "Allow",
"Principal": {
"Service": "ses.amazonaws.com"
},
"Action": "SNS:Publish",
"Resource": "arn:aws:sns:us-east-2:444455556666:MyTopic",
"Condition": {
"StringEquals": {
"aws:SourceOwner": "111122223333"
}
}
}
Run Code Online (Sandbox Code Playgroud)
区别在于第一个示例使用aws:SourceAccount
,第二个示例使用aws:SourceOwner
。
该文档有一个专门的段落,名为“ aws:SourceAccount 与 aws:SourceOwner ”,但我仍然不清楚这两个语句之间的区别。
aws:SourceAccount
您能澄清一下政策声明和政策声明之间的区别吗aws:SourceOwner
?
amazon-s3 amazon-web-services amazon-sns amazon-ses aws-access-policy
设置AWS Elasticsearch之后,我在静态IP服务器上安装了Logstash和Kibana代理,并在ES上添加了这个域访问策略,它运行正常:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "es:*",
"Resource": "arn:aws:es:ap-southeast-1:323137313233:domain/sg-es-logs/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"192.192.192.192"
]
}
}
}
]
}
Run Code Online (Sandbox Code Playgroud)
现在我需要允许Lambda函数es:ESHttpDelete
在AWS ES上执行操作,因此我使用现有角色创建了该函数,service-role/Elasticsearch
然后ARN
从IAM Managment控制台复制了相关内容以将其添加到AWS ES访问策略,以得出:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam:: 323137313233:role/service-role/Elasticsearch"
]
},
"Action": [
"es:*"
],
"Resource": "arn:aws:es:ap-southeast-1:323137313233:domain/sg-es-logs/*"
}
]
}
Run Code Online (Sandbox Code Playgroud)
问题出在ES我应该为静态IP或ARN选择域访问策略,但不能同时选择两者.当我尝试手动合并它们而不是使用控制台时,它不起作用.我检查了AWS文档,但他们没有提到是否可能.
amazon-web-services elasticsearch aws-lambda amazon-elasticsearch aws-access-policy
我有一个基础设施,SNS 主题将消息发送到 SQS(当然使用 SNS 订阅)。当我设置以下访问策略时,它起作用了。
{
"Version": "2012-10-17",
"Id": "__default_policy_ID",
"Statement": [
{
"Sid": "SendMessagePolicy",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "SQS:SendMessage",
"Resource": "arn:aws:sqs:us-east-1:312226948869:mr-sandbox-loyalty",
"Condition": {
"ArnEquals": {
"AWS:SourceArn": "arn:aws:sns:us-east-1:312226948869:mr-sandbox-transaction-created"
}
}
}
]
}
Run Code Online (Sandbox Code Playgroud)
但是,当*
我设置消息时arn:aws:iam::312226948869:root
,消息不会发送到队列。我使用的帐号是312226948869
。有任何想法吗?
谢谢。
更新
在网络控制台中,当我尝试将Principal: 312226949769
其设置为Principal: arn:aws:iam::312226949769:root
我的 aws root 帐户面临未知的问题:
当我尝试通过 aws 站点创建/删除 lambda 时,它显示 403 错误。
几乎相同,当尝试删除之前创建的 lambdas 时:
上次创建 lambda 是大约 2 个月前,大约一个月前我的免费套餐到期了,我收到了电子邮件。但它是如何关联的 - 不知道,一切都应该工作正常,但没有。此外,例如,我可以毫无问题地创建/删除 dynamoDB 表。我在尝试通过 Visual Studio 2019 发布时收到相同的 403,因此无法更新那里的代码。
另外,我的 AWS 个人健康仪表板没有显示任何异常情况。您能否帮助了解问题出在哪里,因为我无法联系 AWS 支持来解决技术主题 - 基本空白限制或类似的问题(awhhhhh)。
amazon-web-services visual-studio aws-lambda aws-access-policy
寻找有关通过 python 脚本和 IAM 角色将文件上传到 AWS S3 存储桶的一些指导。我可以使用 BOTO3 和其他脚本的aws_access_key_id
&上传文件。aws_secret_access_key
但是,我现在已获得 IAM 角色来登录某个帐户。我使用 AWS CLI 来验证和查询 S3 数据没有任何问题,因此我相信我的文件.aws/credential
和.aws/config
文件是正确的。但是我不确定如何在 python 代码中使用 ARN 值。
这是我到目前为止整理的内容,但出现了各种错误,这些错误都导致访问被拒绝:
session = boto3.Session(profile_name='randomName')
session.client('sts').get_caller_identity()
assumed_role_session = boto3.Session(profile_name='randomNameAccount')
print(assumed_role_session.client('sts').get_caller_identity())
credentials = session.get_credentials()
aws_access_key_id = credentials.access_key
aws_secret_access_key = credentials.secret_key
s3 = boto3.client('s3',
aws_access_key_id=aws_access_key_id,
aws_secret_access_key=aws_secret_access_key)
bucket_name = 'bucketName'
Run Code Online (Sandbox Code Playgroud)
这是我的凭据和配置文件的示例,作为参考。
.aws/config
文件:
[profile randomNameAccount]
role_arn = arn:aws:iam::12345678910:role/roleName
source_profile = randomName
Run Code Online (Sandbox Code Playgroud)
aws/credentials
文件:
[randomName]
aws_access_key_id = 12345678910
aws_secret_access_key = 1234567-abcdefghijk
Run Code Online (Sandbox Code Playgroud)
我的问题是帮助 python 代码能够针对 AWS 进行身份验证并使用 …
我需要使用 PHP 使用自定义策略创建签名的 CloudFront URL,但无论我做什么,显然我的策略都是“格式错误”。以下是该函数中生成的策略示例:
{"Statement":{"Resource":"https://d15xojelh58w5d.cloudfront.net/memo/kwz/cvyhkfdqn5oz0z1dz5at4z4s1jsn.kwz","Condition":{"DateLessThan":{"AWS:EpochTime":1490463203},"IpAddress":{"AWS:SourceIp":"1.2.3.4/32"}}}}
Run Code Online (Sandbox Code Playgroud)
生成的网址:
https://d15xojelh58w5d.cloudfront.net/memo/kwz/cvyhkfdqn5oz0z1dz5at4z4s1jsn.kwz?Policy=eyJTdGF0ZW1lbnQiOnsiUmVzb3VyY2UiOiJodHRwczovL2QxNXhvamVsaDU4dzVkLmNsb3VkZnJvbnQubmV0L21lbW8va3d6L2N2eWhrZmRxbjVvejB6MWR6NWF0NHo0czFqc24ua3d6IiwiQ29uZGl0aW9uIjp7IkRhdGVMZXNzVGhhbiI6eyJBV1M6RXBvY2hUaW1lIjoxNDkwNDYzMjAzfSwiSXBBZGRyZXNzIjp7IkFXUzpTb3VyY2VJcCI6IjEuMi4zLjQvMzIifX19fQ__&Signature=MmBPtpipFLuNwaPliGLJajG4gJ7INwD0ptFdxPFYQP9CT-luq6W0SrAs9O9CqbJPHoukXwDzG~c88Rr5I2I9KP5QwD8MHpogGh~3SM3gBYm8ao0Zm7a5C9tWnBVRCtzuGrCrFstK-qLswWmqo6tNiOynSuFpvm9uDe3C8oWE2RzSZavEXoL35D3F8y98NeM0aOJe37EeSpdz3lrZZxei2TugoO-OmnApXa2YYJR2HiQ2l0t8paxcb3xyhCK1c1AR51uOpWLm63k~d0eNZJGo3x0Y6bx0GBqafdvV6jiUv6PbhiMC1ZcTxGnZhLmsz3~ONsEvaR1jyyOPt6y9Nos8yA__&Key-Pair-Id=APKAJ6RV6ACUX5M5IAOQ
Run Code Online (Sandbox Code Playgroud)
代码:
function cloudfront_sign($url, $expiry = null, $ipLock = true) {
$policy = array(
'Statement' => array(
'Resource' => $url,
'Condition' => array(),
),
);
if(!$expiry || $expiry <= time()) $expiry = 2147483647; // CloudFront *requires* an expiry date, so set to 03:14:07 UTC on Tuesday, 19 January 2038 if one is not provided
$policy['Statement']['Condition']['DateLessThan'] = array('AWS:EpochTime' => $expiry);
if($ipLock) $policy['Statement']['Condition']['IpAddress'] = array('AWS:SourceIp' => $_SERVER['REMOTE_ADDR'].'/32');
$signer = new Aws\CloudFront\UrlSigner($_config['keyID'], $_config['keyPath']);
$jsonPolicy = json_encode($policy, …
Run Code Online (Sandbox Code Playgroud)