
特定のバケットに putObject を許可するために、ec2 または ecs インスタンスからのアクセスを許可するバケット ポリシーを作成しようとしています。
いくつか基本的な質問があります。
1) ec2 から同じアカウント内のバケットへのアクセスを許可するだけの場合、バケット ポリシーを使用するのが適切でしょうか? ドキュメントでは、アカウント間のアクセスについて頻繁に言及されているようです。
2) これを実現するための原則はどのようなものであるべきでしょうか? たとえば、「この AWS アカウント内の任意のリソースからのアクセスを許可する」というだけの原則を設定できるでしょうか?
3) プリンシパルで ec2 インスタンスの IAM ロールを指定することにより、これを機能させることができました (下記参照)。しかし、これは推奨される方法でしょうか?
{
"Version": "2012-10-17",
"Id": "Policy1563569774763",
"Statement": [
{
"Sid": "Stmt1563569772515",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::XXXX:role/S3_Read_All"
]
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::some-test-bucket-12345/*"
}
]
}
よろしくお願いします!これを理解するのは難しいです。
答え1
あなたの直感は正しかったです。同じアカウント内のバケットへのアクセスを許可するだけであれば、おそらく次のようにする方が簡単でしょう。IAMポリシーを使用するこのようなポリシーを役割EC2 インスタンスにアタッチされます。
最初のリンクのポリシーを考慮すると、次の点に注意してください。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ListObjectsInBucket",
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::bucket-name"]
},
{
"Sid": "AllObjectActions",
"Effect": "Allow",
"Action": "s3:*Object",
"Resource": ["arn:aws:s3:::bucket-name/*"]
}
]
}
最初のステートメント「ListObjectsInBucket」では、リソースがバケットに設定されています。ARN はarn:aws:s3:::bucket-name
(no *
there) です。2 番目のステートメントでは、arn が に設定されていますarn:aws:s3:::bucket-name/*
。there/*
は「バケット bucket-name 内のすべてのオブジェクト」を意味します。一部の IAM アクションはバケットに適用され、その他はオブジェクトに適用されます。
などのプレフィックスを使用することもできますarn:aws:s3:::bucket-name/prefix*
。これにより、名前が「prefix」で始まるすべてのオブジェクトにアクセスできます。S3 内のオブジェクトの名前は、パス マーカー (「/」) を含む完全な名前であるため、「/path/to/object」であり、「object」だけではないことに注意してください。S3 にはディレクトリはありません。
また、EC2 インスタンスにロールをアタッチすると、インスタンスにアクセスできるすべてのユーザーに、そのロールと同じ権限が付与されます。したがって、EC2 インスタンスにログインできるすべてのユーザーが S3 バケットにもアクセスできることを確認してください。
オブジェクト (ユーザー、ec2 インスタンス、Lambda 関数など) のバケットへのアクセス レベルは、IAM ポリシーとバケット ポリシーを組み合わせたポリシー セットによって決まることに注意してください。また、拒否ステートメントが優先されます。オブジェクトとバケットの両方が同じアカウントにある場合は、どちらか一方のみを使用する必要があり、IAM ポリシーがおそらく自然な選択です。クロス アカウント アクセスでは、基本的にバケット ポリシーは他のアカウントにバケットへのアクセスを許可するために使用されます。IAM ポリシーは他のアカウントにも設定されます。