Lambda 実行ロールを許可して、Amazon S3 バケットにアクセスするにはどうすればいいですか?

最終更新日: 2019 年 4 月 5 日

AWS Lambda 関数を Amazon Simple Storage Service (Amazon S3) バケットにアクセスできるようにしたいです。どうすればできますか?

簡単な説明

以下の手順を実行してください。

1.    S3 バケットへアクセス権を付与する Lambda 関数用に AWS Identity and Access Management (IAM) ロールを作成します。

2.    IAM ロールの信頼ポリシーを変更します。

3.    Lambda 関数の実行ロールとして IAM ロールを設定します。

4.    バケットポリシーが Lambda 関数の実行ロールにアクセス権を付与することを確認します。

重要 : Lambda 関数用に作成した IAM ロールがバケットと同じ AWS アカウントにある場合、IAM ロールとバケットポリシーの両方で Amazon S3 アクセス許可を付与する必要はありません。代わりに、IAM ロールのアクセス許可を付与できます。バケットポリシーが Lambda 関数のロールへのアクセスを明示的に拒否されることを確認します。例として、以下の手順では、IAM ロールの Amazon S3 アクセス許可を付与します。IAM ロールとバケットが異なるアカウントにある場合、IAM ロールとバケットポリシーの両方で Amazon S3 アクセス許可を付与する必要があります。

解決方法

S3 バケットへのアクセス権を付与する Lambda 関数用の IAM ロールを作成する

1.    IAM コンソールを開きます。

2.    ナビゲーションペインで、[ロール] を選択します。

3.    [Create role] を選択します

4.    AWS service の場合 、Lambda を選択します。

5.    [次のステップ: アクセス許可] を選択します。

6.    [次のステップ: タグ] を選択します。

7.    [次のステップ: 確認] を選択します。

8.    ロール名に、ロールの名前を入力します。

9.    [Create role] を選択します

10.    IAM ロールのリストで、作成したロールを選択します。

12.    アクセス許可ビューで、 インラインポリシーの追加 を選択します。

13.    JSON ビューを選択します。

14.    S3 バケットへのアクセス権を付与するポリシーを入力します。次の例のように、ポリシーを使用できます。

{
    "Version": "2012-10-17",
    "Statement": [
{
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets",
                "s3:GetBucketLocation"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::ExampleBucketName",
                "arn:aws:s3:::ExampleBucketName/*"
            ]
        }
    ]
}

15.    [ポリシーの確認] を選択します。

16.    [名前] にポリシーの名前を入力します。

17.    [ポリシーの作成] を選択します。

IAM ロールの信頼ポリシーを変更します。

1.    IAM コンソールで、作成した IAM ロールを開きます。

2.    [信頼関係] タブを選択します。

3.    信頼関係の編集を選択します。

4.    ポリシードキュメントの場合、ポリシーを更新することで、AWS アカウントのルートユーザーがロールを定義できます。IAM ロールとバケットが同じアカウントに属している場合、プリンシパルエンティティとして、ルートアカウントユーザーの Amazon リソースネーム (ARN) を指定するポリシーを使用できます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:root",
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

IAM ロールとバケットが異なるアカウントに属している場合、プリンシパルエンティティとして、両方のルートユーザーの ARN を指定するポリシーを使用できます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": ["arn:aws:iam::123456789012:root",
                "arn:aws:iam::098765432109:root"],
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

Lambda 関数の実行ロールとして、IAM ロールを設定する

1.    Lambda コンソールを開きます。

2.    Lambda 関数を選択します。

3.    実行ロールの状態で、ロールが存在する場合、作成した IAM ロールを選択します。

4.    [保存] を選択します。

Lambda 関数の実行ロールへのアクセス権をバケットポリシーが許可することを確認する

お客様の Lambda 関数の実行ロール (IAM ロール) がバケットと同じ AWS アカウントの場合、バケットポリシーが Lambda 関数あるいは実行ロールへのアクセスを明示的に拒否しないことを確認してください。バケットポリシーがアクセスを明示的に拒否しない限り、IAM ロールに付与されたアクセス許可により、Lambda 関数がパケットにアクセスできます。

Lambda 関数の実行ロールとパケットが異なるアカウントに属する場合、実行ロールからのリクエストについて、バケットへのアクセスを許可するバケットポリシーを追加する必要があります。このクロスアカウントアクセスの場合、 IAM ポリシーとバケットポリシーの両方で、 Amazon S3 へのアクセス許可を実行ロールに付与する必要があります。

以下のようなバケットポリシーを使用できます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:role/ExampleLambdaRoleFor123456789012"
            },
            "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::ExampleBucketName",
        "arn:aws:s3:::ExampleBucketName/*"
            ]
        }
    ]
}

このページは役に立ちましたか?

改善できることはありますか?


さらにサポートが必要な場合