5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GitHub ActionsでOIDC認証してECRにDockerイメージをプッシュする

Last updated at Posted at 2024-12-02

1. はじめに

本記事は以下の学習の続きです。

ECRにリポジトリを作成

右上のリポジトリを作成をクリックします。

image.png

次にリポジトリ名を入力し他の項目はそのままにしてそのまま作成をクリックします。
今回は練習ということでイメージタグのイミュータビリティMutableを指定します。

Amazon ECR でのイメージタグの上書きの防止

スクリーンショット 2024-11-24 13.50.45.png

これでリポジトリの作成は完了です。

作成リポジトリのイメージを確認

作成したリポジトリをクリックしてイメージを確認します。

スクリーンショット 2024-11-24 13.59.43.png

当然ですがまだプッシュしてないのでイメージはひとつもありません。

スクリーンショット 2024-11-24 14.06.59.png

IDプロバイダーを作成

今回AWSの認証はOIDC認証を利用するので、AWS IAMからIDプロバイダーを作成します。

AWS IAM > IDプロバイダ でプロバイダを追加をクリックします。

スクリーンショット 2024-11-24 14.54.59.png

AWS への ID プロバイダーの追加
を参考に以下の値を入力して作成します。

プロバイダのタイプ: OpenID Connect
プロバイダのURL: https://token.actions.githubusercontent.com
対象者: sts.amazonaws.com

スクリーンショット 2024-11-24 15.00.33.png

ロール作成

こちらを参考にしてロールを作成します。

画面右上のロールを作成をクリックします。

スクリーンショット 2024-11-25 22.21.01.png

GitHub Actions のロールを作成する場合は、〜(略)

上記の部分を参考に信頼されたエンティティを選択ページで選択、入力して、次へをクリックします。

信頼されたエンティティタイプ: ウェブアイデンティティ
アイデンティティプロバイダー: https://token.actions.githubusercontent.com
Audience: sts.amazonaws.com
GitHub 組織: Organization Name *1
GitHub repository: GitHubのリポジトリ名 *2
Github branch: GitHubのブランチ名 *3

*1 Organizationがなければ自身のGitHubアカウント名でも良いようです。
*2 Organization内の任意のリポジトリにのみアクセスを許可したい場合は指定します
*3 Organization内の任意のリポジトリ内にある任意のブランチにのみアクセスを許可したい場合は指定します。

スクリーンショット 2024-11-25 22.26.48.png

許可を追加(許可ポリシー選択)ステップはスキップして次へをクリックします。

最後にロール名を入力してロールを作成...する前に信頼ポリシーのJSONを確認してみます。

スクリーンショット 2024-11-25 23.03.05.png

信頼されたエンティティを選択するで入力した項目がきちんと反映されているか確認します。こちらに沿った内容で反映されていることがわかると思います。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Principal": {
                "Federated": "arn:aws:iam::XXXXX:oidc-provider/token.actions.githubusercontent.com"
            },
            "Condition": {
                "StringEquals": {
                    "token.actions.githubusercontent.com:aud": [
                        "sts.amazonaws.com"
                    ]
                },
                "StringLike": {
                    "token.actions.githubusercontent.com:sub": [
                        "repo:yasuha-h/*"
                    ]
                }
            }
        }
    ]
}

問題なさそうなのでロールを作成をクリックしてロール作成は完了です。

ロールにポリシーを追加

ロールを作成するとロール一覧に先ほど作成したロールが表示されているので検索してロールを選択しましょう。

スクリーンショット 2024-11-25 23.31.53.png

このようにまだ許可ポリシーを設定できていないので許可を追加インラインポリシーを作成をクリックしてポリシーを追加します。

IAM Policy Simulator
こんなものがあったのでIAM設定に自信がない方(筆者も)はこれを使って勉強するのも有りだと思います。

スクリーンショット 2024-11-25 23.32.59.png

アクセス許可を指定

サービスを選択今回はECRに対する許可ポリシーを作成するのでelastic container registryと検索してElastic Container Registryを選択します。

アクションを選択

以下のリファレンスから該当の許可アクションを選択します。

以下のJSONはすべてのリソースに対して認証トークンを取得を許可し、ARNで指定しているリソースにのみイメージのアップロードや詳細情報の取得等のアクションを許可していると伺えます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecr:CompleteLayerUpload",
                "ecr:UploadLayerPart",
                "ecr:InitiateLayerUpload",
                "ecr:BatchCheckLayerAvailability",
                "ecr:PutImage",
                "ecr:BatchGetImage"
            ],
            "Resource": "arn:aws:ecr:region:111122223333:repository/repository-name"
        },
        {
            "Effect": "Allow",
            "Action": "ecr:GetAuthorizationToken",
            "Resource": "*"
        }
    ]
}

今回はJSONではなくGUIで設定してみました。

スクリーンショット 2024-11-26 18.37.26.png
スクリーンショット 2024-11-26 18.37.44.png

次へをクリックして、ポリシー名を入力して設定したECRの各アクションが正しいか確認してポリシーを作成をクリックすればロール詳細ページに遷移するのでに許可ポリシーが付与されていることを確認できます。

スクリーンショット 2024-11-26 18.50.33.png

Github Actionsのワークフロー作成

AWS認証

やっとワークフローを触ることができます。以下を参考にしてワークフローを設定していきます。

この aws-actions/configure-aws-credentials アクションを使って、OIDC トークン (JWT) をクラウド アクセス トークンと交換します。

ジョブまたはワークフローの実行には、GitHub の OIDC プロバイダーが実行ごとに JSON Web Token を作成できるようにするために、id-token: write を含む permissions 設定が必要です。

permissions:
  id-token: write # This is required for requesting the JWT
  contents: read  # This is required for actions/checkout

さらに以下のドキュメントを確認します。

完成したworkflowはこちら

git push!

git pushしたらさっそくリポジトリでactionsがうまく動いているか確認します。

スクリーンショット 2024-11-30 21.07.11.png

うまくimageがpushされていることを確認できました!

スクリーンショット 2024-11-30 20.50.32.png

最後に

ちょっとつまずいたところ

  • まずは何から手を付ければいいかの整理するところ
  • IAMロールを作成 → ポリシーを作成の流れが不慣れであったことと、IAMとポリシー設定に苦手なイメージがついてしまっていたためドキュメントを探すまたは理解するところ
  • GitHub Actionsのシークレットキーの読み込みはenvで読み込んで利用しないとnullになってしまうところ

CICDをこれから学習していくっていう方々の参考になれば嬉しいです。

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?