CircleCIからAWS SAMを使ってLambdaにデプロイする
実現したいこと
AWS SAMでLambdaに勝手にデプロイしてくれたら嬉しい。
前提条件
samconfig.toml
があるtemplate.yml
がある
出来上がったyml
version: 2.1 orbs: aws-cli: circleci/aws-cli@3.1.1 sam: circleci/aws-sam-serverless@3.2.0 executors: node: docker: - image: cimg/node:18.2.0 resource_class: large commands: aws-auth: description: AWSとOIDCで認証を行い、認証情報を環境変数にexportする steps: - aws-cli/install - run: | aws_sts_credentials=$(aws sts assume-role-with-web-identity \ --role-arn ${AWS_ROLE_ARN} \ --web-identity-token ${CIRCLE_OIDC_TOKEN} \ --role-session-name "circleci-oidc" \ --duration-seconds 900 \ --query "Credentials" \ --output "json") echo export AWS_ACCESS_KEY_ID="$(echo $aws_sts_credentials | jq -r '.AccessKeyId')" >> $BASH_ENV echo export AWS_SECRET_ACCESS_KEY="$(echo $aws_sts_credentials | jq -r '.SecretAccessKey')" >> $BASH_ENV echo export AWS_SESSION_TOKEN="$(echo $aws_sts_credentials | jq -r '.SessionToken')" >> $BASH_ENV source $BASH_ENV deploy-dev: description: SAMを利用してdev環境のLambdaにデプロイを行なう steps: - sam/install - run: command: | sam deploy \ --config-file samconfig.dev.toml \ --no-confirm-changeset jobs: deploy-dev: executor: node steps: - checkout - aws-auth - deploy-dev workflows: version: 2 deploy: jobs: - deploy-dev: context: - lambda_deploy
はまりどころ
OpenID Connectを使ってCircleCIとAWSを連携させる
参考資料(2つの記事で補完しあっています) CircleCIがOpenID ConnectをサポートしたのでAWSと連携させてJWTを使用したAssumeRoleを試してみた CircleCIとAWSをOpenID Connect 認証で連携する
参考資料をもとに、Contextを作成し、IDプロバイダIAMを作成する。
IAMを作成したらRoleを割り当て、ここで作成したContextにAWS_DEFAULT_REGION
とAWS_ROLE_ARN
を設定する。
SAMからLambdaにDeployする最小ポリシーが難しい
AWS初心者に優しくないポリシーしてました。
参考資料 AWS Lambdaのデプロイに必要なIAMポリシーについて
上記の参考資料から
CloudFormation
DescribeStackEvents DescribeStackSetOperation CreateChangeSet DescribeChangeSet ExecuteChangeSet GetTemplateSummary DescribeStacks
-> すべてのリソース(stackのregion指定するだけでもダメでした)
IAM
GetRole PassRole DetachRolePolicy CreateRole DeleteRole AttachRolePolicy UpdateRole PutRolePolicy CreateUser
-> すべてのリソース
S3
GetBucketTagging GetBucketWebsite GetJobTagging GetObjectVersionTagging RestoreObject GetBucketAcl GetBucketNotification GetBucketPolicy GetObjectVersionTorrent PutObject GetObject GetIntelligentTieringConfiguration GetObjectTagging GetMetricsConfiguration GetBucketLocation GetObjectVersion
-> Bucket name指定くらいまで
Lambda
GetFunction CreateFunction UpdateFunctionCode DeleteFunction AddPermission ListTags (参考資料にないけど)
-> Function指定くらいまで
ここがとてもつらかった。
感想
CircleCIよりもAWSのポリシーのがとっても苦労しました。
追記
- すでにデプロイされたLambdaに対する権限のみで、デプロイされていないLambdaには追加で権限が必要になりそう
- ROLLBACK権限等も足りていない部分があるので要調査かも