Github Actions（IAMロール認証）を使ったLambdaへのデプロイ


# 　はじめに
これまでGit ActionsでAWSサービスと連携する場合は、アクセスキーとシークレットキーといったクレデンシャル情報を使っていたが、IAMロール認証で行えるようになったとのこと。

https://dev.classmethod.jp/articles/github-actions-without-permanent-credential/

ということで、IAMロール認証を用いたGithub ActionsのLambda関数デプロイの方法をまとめてみた。

# IAMロールの作成
- 最初に認証に必要なIAMロールの作成を行う。
- 下記のように進めていく。

## IAMポリシーの作成

- IAMポリシーを作成。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "iam:ListRoles",
                "lambda:UpdateFunctionCode",
                "lambda:CreateFunction",
                "lambda:UpdateFunctionConfiguration"
            ],
            "Resource": "*"
        }
    ]
}
```

## プロバイダの作成

- IDブロバイダを作成。
  - プロバイダのタイプ：OpenID Connect 
  - プロバイダURL：token.actions.githubusercontent.com
  - 対象者：sigstore

## IAMロールの作成
- IAMロールを作成。
- 下記の通りに設定する。
  - 信頼されたエンティティ：ウェブID
  - IDプロバイダ：上記で作成したIDプロバイダを選択
  - Audience：IDプロバイダ作成時の対象者
  - ポリシー：上記で作成したIAMポリシー
- 作成したIAMロールのARNは、Github Actionsの設定で必要なので控えておく。

# Lambda関数の作成
- あらかじめLambda関数を作成しておく。
    - Github Actionsが実行されたときに、対象のLambda関数がないというエラーになってしまうため。
    - あくまでも初回のデプロイのときの考慮。
- Lambda関数名は、Github Acionsの設定で必要なので控えておく。

# Githubの設定

## リポジトリの作成
- Lambda関数を格納するリポジトリを作成する。

## Secretの設定

- IAMロールのARNをGithubのSecretsに登録しておく。
- 登録方法は下記参照。  
https://docs.github.com/ja/actions/security-guides/encrypted-secrets  
- Seｃret登録時の項目は以下のようにする。
    - Name：AWS_ROLE_ARN
    - Value：作成したIAMロールのARN
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264860/41f3c8b8-ec7b-7c87-dbe6-7f649d495524.png)

## Github Actionsの設定

### ワークフローの作成
- 対象のリポジトリの「Actions」タブを押すと、下記画像のページが表示されるので「set up a workflow yourself」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264860/5e56e979-53c6-0136-9501-b636c49875ee.png)
- 設定ファイルの作成画面が表示されるので、ここに記載していく（内容については次章）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264860/375ccf97-a3ef-12a9-0af1-d3b22ba0472b.png)


### 設定ファイルの作成
- 上記手順で作成した設定ファイルを下記のように書いていく。

```yaml
name: deploy to lambda

on:
    push:
        branches:
            - main
    pull_request:

jobs:
   deploy:
        runs-on: ubuntu-latest
        permissions:
            id-token: write
            contents: read
        steps:
            - name: Configure AWS Credentials
              run: |
                export AWS_ROLE_ARN=${{ secrets.AWS_ROLE_ARN }}
                export AWS_WEB_IDENTITY_TOKEN_FILE=/tmp/awscreds
                export AWS_DEFAULT_REGION=ap-northeast-1

                echo AWS_WEB_IDENTITY_TOKEN_FILE=$AWS_WEB_IDENTITY_TOKEN_FILE >> $GITHUB_ENV
                echo AWS_ROLE_ARN=$AWS_ROLE_ARN >> $GITHUB_ENV
                echo AWS_DEFAULT_REGION=$AWS_DEFAULT_REGION >> $GITHUB_ENV

                curl -H "Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN" "$ACTIONS_ID_TOKEN_REQUEST_URL&audience=sigstore" | jq -r '.value' > $AWS_WEB_IDENTITY_TOKEN_FILE
            - uses: actions/checkout@v2
            - uses: actions/setup-python@v2
              with:
                python-version: 3.9
            - run: zip -r package.zip ./*
            - run: pip3 install awscli
            - run: aws lambda update-function-code --function-name {作成したLambda関数名} --zip-file fileb://package.zip --publish
```
※{作成したLambda関数名}の箇所は｛｝は除去すること。


# 実行
- 実際に実行を行うと、以下のような画面が表示される、無事完了すると、Lambdaに関数がデプロイされる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264860/a055766d-c298-11d8-a808-d79ce26c790b.png)