ToC
GitHubにクレデンシャルを渡さなくても良い
GitHub Actionsでビルドした成果物をAWS上に配備したいことがあるのではないでしょうか。
その際に少し前までは、永続的なクレデンシャルを渡す必要があったのですが、セキュリティ的にもあまり良いとは言えないと
個人的には思っていました。
1年ぐらい前にはなってしまいますが、2021年秋頃に界隈でも話題になった内容なのですが、これまでGitHub Actionsを
使っていながら、試していなかったので改めて試してみました。
メカニズムについては、GitHubのブログに記載されています。
OpenID Connect Providerの設定
まず、連携するAWSアカウントにて、GitHub Actionsで利用する認証連携のためのOpenID Connect Provider
を作成します。
こちらは、AWSアカウントに対して1回だけ作成すれば良いようです。
ちなみにThumbprint
を取得する際には、マネジメントコンソールから取得できます。 IAM
> Identity providers
> Add provider
で
OpenID Connect
を選択して、URL
を入力すると取得できます。
Resources:
GithubOidc:
Type: AWS::IAM::OIDCProvider
Properties:
Url: https://token.actions.githubusercontent.com
ClientIdList:
- sts.amazonaws.com
ThumbprintList:
- !Ref "Thumbprint"
IAM Roleの設定
次にGitHub Actionsに利用を許可するIAM Role
を設定します。
ポイントは、Principal
として、さきほど作成したOIDCProvider
を指定した上で、
さらにCondition
設定にて呼び出し元となるGitHub Actions
のレポジトリを指定して呼び出し元を限定しているところですね。
目的や用途によるとは思いますが、Principle of Least Privilege (最小権限の原則)
の設計思想にしたがって、
必要な権限だけを付与することをおすすめします。
Resources:
GithubCDRole:
Type: AWS::IAM::Role
Properties:
RoleName: !Sub "github-cd-role"
AssumeRolePolicyDocument:
Statement:
- Effect: Allow
Action: sts:AssumeRoleWithWebIdentity
Principal:
Federated: !Sub "arn:${AWS::Partition}:iam::${AWS::AccountId}:oidc-provider/token.actions.githubusercontent.com"
Condition:
StringLike:
token.actions.githubusercontent.com:sub: !Sub repo:${GitHubOrganization}/${RepositoryName}:*
Policies:
- PolicyName: !Sub 'CloudFormation'
PolicyDocument:
Version: "2012-10-17"
Statement:
- Sid: !Sub 'Validate01'
Effect: Allow
Action:
- "cloudformation:ValidateTemplate"
Resource:
- "*"
GitHub Actionsの設定
AWSを利用する際のGitHub Actions
のJob
の例を下記に示します。
まず、事前に設定したIAM Role
のArn情報をGitHubのActions secrets
に設定します。
下記の例では、AWS_CD_ROLE_TO_ASSUME
としています。
上記を設定した上で、AWSが公開しているGitHub Actions
であるConfigure AWS Credentialsを活用します。
Readmeが充実しているので、その内容を確認しながら進めればあまり悩むことはないかと思います。
jobs:
cloudformation-validate:
runs-on: ubuntu-latest
env:
TEMPLATE_PATH: "cfn"
TEMPLATE_FILE: "*.yaml"
AWS_REGION: "us-west-2"
permissions:
id-token: write
contents: read
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
role-to-assume: "${{ secrets.AWS_CD_ROLE_TO_ASSUME }}"
aws-region: "${{ env.AWS_REGION }}"
role-duration-seconds: 900
- name: Cloud Formation Validate
if: success()
run: |
# validate template (<= 51,200)
for file_path in $(find ./${TEMPLATE_PATH} -name ${TEMPLATE_FILE} -size -51200c); do
aws --region ${AWS_REGION} cloudformation validate-template --template-body file://${file_path}
done
さらにもう少し踏み込むと、GitHub Actions
でビルドしたDocker ImageをECR
に登録することも比較的簡単にできるようになります。
Amazon ECR “Login” Action for GitHub Actionsなどを参考に進めてみるのも良いのではないでしょうか。
この機能は、AWSの機能検証を行う際にGitHubに登録したソースコードを直接活用できるという点で非常に良い機能ですね。
参照
- AWS federation comes to GitHub Actions
- GitHub Actions: Secure cloud deployments with OpenID Connect
- Configure AWS Credentials
- Amazon ECR “Login” Action for GitHub Actions