##🔶 はじめに
本内容は、以下の続きです。
Lambda関数をアプリ化して、Serverless Application Repositoryで公開しよう [15分で完成編]
Serverless Application Repositoryにサーバレスアプリを登録することで、アカウント内でアプリを利用しやすくする事ができたので、今回は他のアカウントでもアプリを使えるようにしたいと思います。
##🔶 作業手順
- SAMファイルの、IAMの記述の修正
- Serverless Application Repositoryに、SAMファイルを再登録
- アプリを利用させたいAWSアカウントの登録
##🔶 SAMファイルの、IAMの記述の修正
1. SAMファイルの確認
修正前のSAMファイルは以下の通りです。
sampleHello
というLambda関数の設定情報のみが記載されています。
AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Description: An AWS Serverless Specification template describing your function.
Resources:
sampleHello:
Type: 'AWS::Serverless::Function'
Properties:
Handler: index.handler
Runtime: nodejs8.10
CodeUri: s3://sample-hello-bucket/sample_Hello-cba9fc2c-bd5b-407c-81fa-cc8d832858ad.zip
Description: ''
MemorySize: 128
Timeout: 3
Role: 'arn:aws:iam::■■■■■■:role/service-role/sample_Hello-role-k6eww01p'
この設定で問題になるのが、Role: 'arn:aws:iam::■■■■■■:role/service-role/sample_Hello-role-k6eww01p'
の記述です。
このLambda関数はsample_Hello-role-k6eww01p
というロールを使う旨が記載されていますが、このロールは自分のAWSアカウントにはありますが、他のAWSアカウントには無いので、このSAMファイルに従ってデプロイを行うと、この部分でエラーが発生します。
そこで、sample_Hello-role-k6eww01p
というロールがどういう内容のものか明記して、他のAWSアカウントでデプロイする際に、ロールも一緒に構築するようにします。
2. ロールのポリシーの確認
sample_Hello-role-k6eww01p
というロールに、どのようなポリシーが付加されているか確認します。
すると、「AWSLambdaBasicExecutionRole-10eb65・・・・」というポリシーが付加されています。
これはAWSでデフォルトで用意されているポリシーをコピーして作ったものなので、実質は以下の「AWSLambdaBasicExecutionRole」と同じです。
よって、「AWSLambdaBasicExecutionRole」のポリシーARNをコピーします。
3. SAMファイルにロールの定義を追加
SAMファイルに、「AWSLambdaBasicExecutionRole」というポリシーを持った、「tsuikaRole」というロールの定義を追記します。
AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Description: An AWS Serverless Specification template describing your function.
Resources:
# ↓のRole定義を追加
tsuikaRole:
Type: "AWS::IAM::Role"
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
-
Effect: "Allow"
Principal:
Service:
- "lambda.amazonaws.com"
Action:
- "sts:AssumeRole"
Path: "/"
ManagedPolicyArns:
- 'arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole'
# Policies:
# -
# PolicyName: "tsuikaPolicy"
# PolicyDocument:
# Version: "2012-10-17"
# Statement:
# -
# Effect: Allow
# Action:
# - "logs:CreateLogGroup"
# - "logs:CreateLogStream"
# - "logs:PutLogEvents"
# Resource: "*"
sampleHello:
Type: 'AWS::Serverless::Function'
Properties:
Handler: index.handler
Runtime: nodejs8.10
CodeUri: s3://sample-hello-bucket/sample_Hello-cba9fc2c-bd5b-407c-81fa-cc8d832858ad.zip
Description: ''
MemorySize: 128
Timeout: 3
# Role: 'arn:aws:iam::028784405484:role/service-role/sample_Hello-role-k6eww01p'
Role: !GetAtt tsuikaRole.Arn
上記のtsuikaRole
のブロックが、ロールの定義情報です。
ポリシーの定義情報は、本来はコメントアウトしているPolicies
のように書いたりしますが、今回はAWSが管理している標準のポリシーを使うので、ManagedPolicyArns
として、先程コピーしたポリシーARNをセットするだけで良いです。
また、sampleHello
も使用するロールが、今回定義するtsuikaRole
に変更になるので、!GetAtt tsuikaRole.Arn
と記載します。
Fn::GetAtt
は、「このテンプレート内の指定した値(今回はtsuikaRole
)の属性値を参照する」という記述です。
##🔶 Serverless Application Repositoryに、SAMファイルを再登録
1. SAMファイルの再登録
Serverless Application Repositoryの、登録したサーバレスアプリの画面を開き、[新しいバーションを発行]をクリックする。
「セマンティックバージョン」に、新しいバージョンNoを、「SAMテンプレート」に修正したSAMファイルをセットして、[公開バージョン]をクリックします。
SAMファイルに問題が無ければ、新しいバージョンとして登録されます。
##🔶 アプリを利用させたいAWSアカウントの登録
1. AWSアカウント番号の登録
新しいバージョンとして登録できたら、[Add]をクリックします。
アプリを利用させたいAWSアカウント番号をセットして、[Save]をクリックします。
問題が無ければ、以下のように登録されます。
##🔶 動作確認
対象のAWSアカウントで、Serverless Application Repositoryの、Private applicationsを検索します。
今回、IAMの登録もあるので、「Show apps that・・・」のチェックを入れる必要があります。
登録したアプリが見つかれば、デプロイを試してみてください。
##🔶 まとめ
以上の手順で、自作のサーバレスアプリを、他のAWSアカウントでも使えるようになります。
やはり難しいポイントはSAMファイルの設定で、慣れないとSAMファイルの登録時や、アプリのデプロイ時にエラーが頻発するので、根気よく頑張ってください。
便利なLambda関数を是非みんなに公開して、生産性をアップしていきましょう。
##🔶 参考