1. はじめに
本記事は以下の学習の続きです。
ECRにリポジトリを作成
右上のリポジトリを作成
をクリックします。
次にリポジトリ名を入力し他の項目はそのままにしてそのまま作成
をクリックします。
今回は練習ということでイメージタグのイミュータビリティ
をMutable
を指定します。
これでリポジトリの作成は完了です。
作成リポジトリのイメージを確認
作成したリポジトリをクリックしてイメージを確認します。
当然ですがまだプッシュしてないのでイメージはひとつもありません。
IDプロバイダーを作成
今回AWSの認証はOIDC認証
を利用するので、AWS IAMからIDプロバイダーを作成します。
AWS IAM > IDプロバイダ でプロバイダを追加
をクリックします。
AWS への ID プロバイダーの追加
を参考に以下の値を入力して作成します。
プロバイダのタイプ: OpenID Connect
プロバイダのURL: https://token.actions.githubusercontent.com
対象者: sts.amazonaws.com
ロール作成
こちらを参考にしてロールを作成します。
画面右上のロールを作成
をクリックします。
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内の任意のリポジトリ内にある任意のブランチにのみアクセスを許可したい場合は指定します。
許可を追加(許可ポリシー選択)ステップはスキップして次へ
をクリックします。
最後にロール名を入力してロールを作成
...する前に信頼ポリシー
のJSONを確認してみます。
信頼されたエンティティを選択する
で入力した項目がきちんと反映されているか確認します。こちらに沿った内容で反映されていることがわかると思います。
{
"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/*"
]
}
}
}
]
}
問題なさそうなのでロールを作成
をクリックしてロール作成は完了です。
ロールにポリシーを追加
ロールを作成するとロール一覧に先ほど作成したロールが表示されているので検索してロールを選択しましょう。
このようにまだ許可ポリシーを設定できていないので許可を追加
→インラインポリシーを作成
をクリックしてポリシーを追加します。
IAM Policy Simulator
こんなものがあったのでIAM設定に自信がない方(筆者も)はこれを使って勉強するのも有りだと思います。
アクセス許可を指定
サービスを選択
今回は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で設定してみました。
次へ
をクリックして、ポリシー名を入力して設定したECRの各アクションが正しいか確認してポリシーを作成
をクリックすればロール詳細ページに遷移するのでに許可ポリシーが付与されていることを確認できます。
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がうまく動いているか確認します。
うまくimageがpushされていることを確認できました!
最後に
ちょっとつまずいたところ
- まずは何から手を付ければいいかの整理するところ
-
IAMロール
を作成 →ポリシー
を作成の流れが不慣れであったことと、IAMとポリシー設定に苦手なイメージがついてしまっていたためドキュメントを探すまたは理解するところ - GitHub Actionsのシークレットキーの読み込みは
env
で読み込んで利用しないとnull
になってしまうところ
CICDをこれから学習していくっていう方々の参考になれば嬉しいです。