AWS Serverless Application Model 入門ハンズオンシリーズ - log4ketancho の第6弾です。この記事では、SAM で IAM ロールを構築する方法をまとめたいと思います。
このシリーズの第1弾(下記の記事)において、
Role は各環境の ARN に置き換えてください
と書きました。実はしれっと既存の IAM ロールがあることを前提にここまで進めてきました。ですが、SAM でサーバレスな環境を作るからには、IAM ロールの構築も SAM 化すべきです。
IAM ロールの作成
IAM ロールを作成するには、
AssumeRolePolicyDocument
: どのリソースに IAM ロールを割り当てるかを決定Policies
: IAM ロールに割り当てる IAM ポリシーを設定
を定義する必要があります。
AssumeRolePolicyDocument: どのリソースに IAM ロールを割り当てるかを決定
作成した IAM ロールがアタッチされる AWS リソースが何か(例:EC2)を定義します。今回は Lambda に割り当てたいので、下記のような定義にします。
AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: lambda.amazonaws.com Action: "sts:AssumeRole"
Policies: IAM ロールに割り当てる IAM ポリシーを設定
続いて、IAM ロールが割り当てられたリソースに、どのような操作をするかを定義します。ここでは、CloudWatch と SES を扱うことができるロールを作成してみます。
Policies: - PolicyName: "billing_mail_for_lambda" PolicyDocument: Version: "2012-10-17" Statement: - Effect: "Allow" Action: "cloudwatch:*" Resource: "*" - Effect: "Allow" Action: "ses:*" Resource: "*"
最終的には、下記のようなResources
定義になります。
Resources: BillingIamRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: lambda.amazonaws.com Action: "sts:AssumeRole" Policies: - PolicyName: "billing_mail_for_lambda" PolicyDocument: Version: "2012-10-17" Statement: - Effect: "Allow" Action: "cloudwatch:*" Resource: "*" - Effect: "Allow" Action: "ses:*" Resource: "*"
作成した IAM ロールを Lambda に割り当てる
続いて、IAM ロールの割り当てをします。上で作った IAM ロールの ARN が何になるかはこの時点では分からないので、CFn の関数を用いて !GetAtt BillingIamRole.Arn
という形で取得する必要があります。(BillingIamRole
は上で作成した IAM ロールのリソース名です。)
BillingLambda: Type: AWS::Serverless::Function Properties: CodeUri: functions/billing_mail/billing_mail.zip Handler: billing_mail.lambda_handler Runtime: python3.6 Role: !GetAtt BillingIamRole.Arn Timeout: 30
AWS Serverless Application Model 入門ハンズオンシリーズ - log4ketancho の第3弾の記事でも紹介しましたが、CloudFormation が提供する関数を用いることで、環境に依存しない、再利用しやすいテンプレートを作ることができます。Cfn 関数のうち、代表的なものの利用方法を下記の本で解説させていただいたので、ご覧いただけると幸いです。
Amazon Web Services 業務システム設計・移行ガイド (Informatics&IDEA)
- 作者: 佐々木拓郎,林晋一郎,瀬戸島敏宏,宮川亮,金澤圭
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2018/01/20
- メディア: 単行本
- この商品を含むブログ (1件) を見る
以上で完成となります。実行すると期待通りの IAM ロールができたでしょうか?念のため、Resource 定義の最終型を貼っておきます。
# SAM Resources Resources: SamSampleLambda: Type: AWS::Serverless::Function Properties: CodeUri: functions/billing_mail/billing_mail.zip Handler: billing_mail.lambda_handler Runtime: python3.6 Role: !GetAtt BillingIamRole.Arn Timeout: 30 Events: Timer: Type: Schedule Properties: Schedule: cron(0 0 * * ? *) # JST AM9:00 BillingIamRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: lambda.amazonaws.com Action: "sts:AssumeRole" Policies: - PolicyName: "billing_mail_for_lambda" PolicyDocument: Version: "2012-10-17" Statement: - Effect: "Allow" Action: "cloudwatch:*" Resource: "*" - Effect: "Allow" Action: "ses:*" Resource: "*"
まとめ
SAM の使い方を紹介する記事ですが、今回の機能はすべて CloudFormation の機能として提供されているものです。IAM 関連のリソースもプログラマブルに作成することで、「適切な権限管理がなされているか」をコードレビュー形式で確認することができます。なるべく手作業による設定を減らすことで、素早く&確実に環境構築をしていければと思います。
この記事は、AWS Serveless Application Model 入門シリーズの第6弾です。もしよろしければ他の記事も参考にしていただければと思います。