AWS IAMポリシーのよくあるユースケース10選とおまけポリシー

## はじめに
AWS IAM（Identity and Access Management）は、AWSリソースに対するアクセス制御を行うための強力なツールです。

この記事では、さまざまなシーンで活用できるIAMポリシーの具体例を10個紹介します。

これらのポリシーは、特定のタスクに対して必要な権限だけを付与し、セキュリティを維持しつつ効率的に運用できるようカスタマイズ可能です。

また、前回の記事ではIAMポリシーの設定方法について詳しく解説しているので、そちらもぜひ参考にしてください。

https://qiita.com/free-honda/items/e306b7d752e74e1b4c04

## 知識整理
以下に、必要な必要な知識を整理します。

### IAMとは
IAM（Identity and Access Management）は、AWSのサービスで、ユーザーやグループのアクセス権限を管理するための機能です。

https://aws.amazon.com/jp/iam/

IAMを使用することで、誰がAWSリソースにアクセスできるか、またそのユーザーがどの操作を行えるかを細かく制御することができます。

### IAMポリシーとは
IAMポリシーは、JSON形式で書かれたドキュメントで、特定のアクションを許可または拒否するためのルールを定義します。

![スクリーンショット 2024-09-27 7.16.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/555339ad-26a3-fc52-e04e-76b874fbb60e.png)
引用画像：https://iselegant.hatenablog.com/entry/2020/05/24/215808

ポリシーはユーザー、グループ、ロールにアタッチして使用され、AWSリソースへのアクセス制御を実現します。

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_policies.html


## AWS IAMポリシーのユースケース10選
### 1. S3バケットへの読み取り専用アクセス
このポリシーは、特定のS3バケット内のデータを読み取るのみ許可するものです。書き込みや削除は許可されません。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::example-bucket/*"
        }
    ]
}
```

### 2. EC2のスタートとストップを許可するポリシー
このポリシーは、EC2インスタンスを起動・停止する権限のみを付与します。インスタンスの作成や削除は許可されません。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:StartInstances",
                "ec2:StopInstances"
            ],
            "Resource": "arn:aws:ec2:region:account-id:instance/*"
        }
    ]
}
```

### 3. Lambda関数のデプロイ権限
このポリシーは、Lambda関数のデプロイや更新を許可し、その他の操作は制限します。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "lambda:UpdateFunctionCode",
                "lambda:CreateFunction"
            ],
            "Resource": "arn:aws:lambda:region:account-id:function:*"
        }
    ]
}
```

### 4. RDSインスタンスのスナップショット作成と取得
このポリシーは、RDSインスタンスのスナップショットを作成し、既存のスナップショットにアクセスする権限を与えます。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "rds:CreateDBSnapshot",
                "rds:DescribeDBSnapshots"
            ],
            "Resource": "arn:aws:rds:region:account-id:snapshot:*"
        }
    ]
}
```

### 5. CloudWatchログのアクセス権限
このポリシーは、CloudWatchロググループへのアクセスを許可し、ログを閲覧できるようにします。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:DescribeLogGroups",
                "logs:GetLogEvents"
            ],
            "Resource": "arn:aws:logs:region:account-id:log-group:*"
        }
    ]
}
```

### 6. IAMユーザーの自己パスワード変更権限
このポリシーは、IAMユーザーが自分のパスワードを変更する権限を与えるものです。他のユーザーやリソースへのアクセスは制限されています。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "iam:ChangePassword",
            "Resource": "arn:aws:iam::account-id:user/${aws:username}"
        }
    ]
}
```

### 7. DynamoDBテーブルへの読み書きアクセス
このポリシーは、特定のDynamoDBテーブルに対する読み取りおよび書き込みアクセスを許可します。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:GetItem",
                "dynamodb:PutItem",
                "dynamodb:UpdateItem"
            ],
            "Resource": "arn:aws:dynamodb:region:account-id:table/example-table"
        }
    ]
}
```

### 8. Elastic Load Balancerの管理権限
このポリシーは、ELBの作成、削除、設定変更を許可します。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "elasticloadbalancing:CreateLoadBalancer",
                "elasticloadbalancing:DeleteLoadBalancer",
                "elasticloadbalancing:DescribeLoadBalancers"
            ],
            "Resource": "*"
        }
    ]
}
```

### 9. S3バケットに対する全アクセス許可
このポリシーは、S3バケットに対して完全な読み取り・書き込みアクセスを許可します。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": "arn:aws:s3:::example-bucket/*"
        }
    ]
}
```

### 10. IAMユーザーの作成・管理権限
このポリシーは、IAMユーザーの作成、更新、削除を行う権限を付与します。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iam:CreateUser",
                "iam:DeleteUser",
                "iam:UpdateUser"
            ],
            "Resource": "arn:aws:iam::account-id:user/*"
        }
    ]
}
```

## まとめ
これらのIAMポリシーは、AWSリソースに対して厳格なアクセス制御を行うために使用されます。

ポリシーは**常に「最小権限の原則」に基づいて設計し、必要な操作だけを許可するようにしましょう。また、定期的にポリシーを見直し、変更や改善が必要な場合はすぐに対応することが大切**です。

AWS IAMポリシーをうまく活用することで、安全かつ効率的にAWS環境を管理することが可能です。

## おまけ
面白いAWS IAMポリシーとして、「午前中だけEC2インスタンスをスタートできるポリシー」を作成してみます。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ec2:StartInstances",
            "Resource": "arn:aws:ec2:region:account-id:instance/*",
            "Condition": {
                "DateGreaterThanEquals": {
                    "aws:CurrentTime": "2024-09-27T09:00:00Z"
                },
                "DateLessThanEquals": {
                    "aws:CurrentTime": "2024-09-27T12:00:00Z"
                }
            }
        },
        {
            "Effect": "Deny",
            "Action": "ec2:StartInstances",
            "Resource": "arn:aws:ec2:region:account-id:instance/*",
            "Condition": {
                "DateGreaterThan": {
                    "aws:CurrentTime": "2024-09-27T12:00:00Z"
                }
            }
        }
    ]
}
```

このポリシーを使えば、例えばチームメンバーに「午前中に集中して作業してもらいたい」など、ユニークな管理が可能です！笑

## 参考記事
https://qiita.com/montama/items/90bb8a3973d101be4690

https://zenn.dev/fdnsy/articles/31105a37126d66