個人的な備忘録：AWS CLIでECRイメージ取得用のIAMロールを作成してみた

## はじめに
AWSでDockerファイルを使用してコンテナイメージを実行する場合、ECR (Elastic Container Registry) にアップロードされたイメージを利用します。

:::note warn
**この記事では、将来的にこのコンテナイメージをAWS Lambdaで実行し、サーバーレス環境で動かす方法を技術検証する予定です。**
:::

今回は、その事前準備として、IAM権限の設定について、自分の知識を整理しながら体系的にまとめました。

## 書こうと思ったきっかけ
個人的なインフラ開発として、以下のようなLambda関数を活用したサーバーレスアーキテクチャに挑戦してみたいと考えています。

```（省略）text
ユーザー
   │
   ├──> CloudFront (フロントエンド静的ファイル配信)
   │       └──> S3 (TypeScript ビルド成果物)
   │
   └──> API Gateway (バックエンドリクエスト受付)
           └──> Lambda (Go + Echo で構築)
                   └──> RDS (データベース: PostgreSQL / MySQL)
```

Dockerファイルについては、AWSのECRに前回の記事でプッシュしました。

:::note
***次は、Lambda関数を使用してこのイメージを読み込む方法に取り組みたいと考えています。***
:::

👉 **前回の記事はこちら**

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

ただし、Lambda関数を使用するには、IAMロールや権限設定が必要です。

**そのため、これらの設定について改めて整理し、1本の記事としてまとめていきたいと思います。**

## 今回作成するIAMロールについて
今回は、AWSがあらかじめ用意しているLambda関数用のIAMロールをアタッチし、それに加えてECR専用のカスタムIAMポリシーを設定します。

**最終的なIAMロール**

![Screenshot 2025-01-14 at 4.42.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/fd16aca4-ac2f-ceb4-674b-bd0c5f55097a.png)

これまでは手動で設定することが多かったのですが、今回はAWS CLIを使用して簡単にセットアップを進めます。

***※そのため、手動操作とは異なる部分がある点をご承知おきください。***

## IAM権限の設定

### 1. Lambda用IAMロールの作成
AWS CLIを使用して、Lambda関数用のIAMロールを作成します。

**IAMロールの作成**

以下のコマンドを実行し、Lambda関数用IAMロールを作成します。

```bash
aws iam create-role \
  --role-name lambda-execution-role \
  --assume-role-policy-document file://trust-policy.json
```

**`trust-policy.json` の内容**

以下は、IAMロールに適用する信頼ポリシーの内容です。***この設定により、Lambdaがロールを引き受けることが許可されます。***

```trust-policy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

**基本ポリシーのアタッチ**

作成したIAMロールに、Lambdaの実行に必要な基本ポリシーをアタッチします。

```bash
aws iam attach-role-policy \
  --role-name lambda-execution-role \
  --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
```

### 2. ECR用IAMポリシーの作成

**カスタムIAMポリシーの作成**

ECRへのアクセスを許可するカスタムIAMポリシーを作成します。

```bash
aws iam create-policy \
  --policy-name ECRAccessPolicy \
  --policy-document file://ecr-access-policy.json
```

- **--policy-name**: ポリシー名（例: `ECRAccessPolicy`）
- **--policy-document**: JSONファイルで記述されたポリシーの内容（例: `ecr-access-policy.json`）

`ecr-access-policy.json`の内容

以下は、ECRへのアクセスを許可するポリシーの例です。

```ecr-access-policy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ecr:GetAuthorizationToken",
        "ecr:BatchCheckLayerAvailability",
        "ecr:GetDownloadUrlForLayer",
        "ecr:BatchGetImage"
      ],
      "Resource": "*"
    }
  ]
}
```

このポリシーは、ECRから認証トークンを取得したり、イメージをプルする操作を許可します。

**ECRポリシーのアタッチ**

作成したカスタムポリシーを、Lambda用IAMロール (lambda-execution-role) にアタッチします。

```bash
aws iam attach-role-policy \
  --role-name lambda-execution-role \
  --policy-arn arn:aws:iam::<ACCOUNT_ID>:policy/ECRAccessPolicy
```

以下の部分は、自身のAWSアカウントIDに置き換える必要があります。

- `<ACCOUNT_ID>`: あなたのAWSアカウントIDを指定してください。

**ここまでの確認**

今回はAWS CLIを使用して簡単にセットアップを進めました。

***以下のスクリーンショットの通り、IAMロールが想定通り作成されていることが確認できました。***

![Screenshot 2025-01-14 at 4.45.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/1cc4e600-c34f-2108-1078-7d0ed0cf0780.png)

また、ロールの詳細設定についても、冒頭でお見せしたスクリーンショットと一致していることが確認できました。

**これにより、作業は無事成功といえます！**

## まとめ

ここまでお読みいただき、ありがとうございました。

:::note info
**私自身、AWS CLIを使ってIAMの設定を行う機会はそれほど多くなかったため、今回の作業は非常に新鮮な学びとなりました。**
:::

***次回は、このIAMロールを活用して、コンテナイメージをAWS Lambdaで実行し、サーバーレス環境で動かす方法について解説していきます！***

## 関連記事

今までIAM関連の記事は何分か投稿してきましたので、気になる方も読んでみてください。

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

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

https://qiita.com/free-honda/items/5bb71782c8a84585206a