<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Cloudcomposer on Think and Write</title><link>https://kenjiusui.github.io/blog/tags/cloudcomposer/</link><description>Recent content in Cloudcomposer on Think and Write</description><generator>Hugo</generator><language>ja</language><lastBuildDate>Thu, 09 Jun 2022 00:01:17 +0900</lastBuildDate><atom:link href="https://kenjiusui.github.io/blog/tags/cloudcomposer/index.xml" rel="self" type="application/rss+xml"/><item><title>Cloud FunctionをCloud Composerから認証有りでHTTP起動する</title><link>https://kenjiusui.github.io/blog/posts/biz/003_cloud-function%E3%82%92cloud-composer%E3%81%8B%E3%82%89%E8%AA%8D%E8%A8%BC%E6%9C%89%E3%82%8A%E3%81%A7http%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B/</link><pubDate>Thu, 09 Jun 2022 00:01:17 +0900</pubDate><guid>https://kenjiusui.github.io/blog/posts/biz/003_cloud-function%E3%82%92cloud-composer%E3%81%8B%E3%82%89%E8%AA%8D%E8%A8%BC%E6%9C%89%E3%82%8A%E3%81%A7http%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B/</guid><description>&lt;p&gt;Cloud ComposerからCloud Functionsにある関数を認証有りのHTTPトリガーで軌道する方法です。&lt;br&gt;
公式のドキュメントに書いてありますが備忘録として書きます。&lt;br&gt;
たぶん、これが一番簡単だと思いますが他に良い方法があったら教えてください。&lt;/p&gt;
&lt;h1 id="環境"&gt;環境&lt;/h1&gt;
&lt;p&gt;Airflow: 2.1.4&lt;/p&gt;
&lt;h1 id="やりかた"&gt;やりかた&lt;/h1&gt;
&lt;p&gt;やることはわかってしまえば簡単です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;関数の実行権限をCloud Composerに付与する&lt;/li&gt;
&lt;li&gt;IDトークンを発行する&lt;/li&gt;
&lt;li&gt;HTTPリクエストのheaderにトークンを含めて送る&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これだけです。&lt;/p&gt;
&lt;h1 id="詳しいやり方"&gt;詳しいやり方&lt;/h1&gt;
&lt;h2 id="関数の実行権限をcloud-composerに付与する"&gt;関数の実行権限をCloud Composerに付与する&lt;/h2&gt;
&lt;p&gt;GCPのコンソールからポチポチやるのが簡単だと思います。&lt;br&gt;
具体的な手順はドキュメントを参照してください。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://cloud.google.com/functions/docs/securing/authenticating#authenticating_function_to_function_calls"&gt;https://cloud.google.com/functions/docs/securing/authenticating#authenticating_function_to_function_calls&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ポイントは受信する側の関数ごとにroles/cloudfunctions.invokerを設定するということです。&lt;br&gt;
やっていないのでわかりませんがComposerのサービスアカウントにroles/cloudfunctions.invokerを付与するのではなく関数側から設定する必要がありそうです。&lt;br&gt;
一括で付与とかはできないのかな？できそうな気もするのでわかる人いたら教えてください。&lt;/p&gt;
&lt;h2 id="idトークンを発行する"&gt;IDトークンを発行する&lt;/h2&gt;
&lt;p&gt;ここからはComposerのDAGのコードになります。&lt;br&gt;
DAGでHTTPリクエストを送るまえに認証に使用するIDトークンを発行します。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;import google.auth.transport.requests
import google.oauth2.id_token
auth_req = google.auth.transport.requests.Request()
# endpoint はCloud Functionsにある関数のエンドポイントのURL
id_token = google.oauth2.id_token.fetch_id_token(auth_req, endpoint)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これで得られたid_tokenが目的のものになります。&lt;br&gt;
&lt;code&gt;endpoint&lt;/code&gt; はCloud Functionsにある関数のエンドポイントのURLです。&lt;br&gt;
このトークンの発行に使っているGoogleのライブラリはComposerであればインストールされているはずなので簡単に利用できます。&lt;/p&gt;
&lt;h2 id="httpリクエストを送る"&gt;HTTPリクエストを送る&lt;/h2&gt;
&lt;p&gt;最後はComposerからHTTPリクエストを送って関数を実行するだけです。&lt;br&gt;
単純に関数を実行するだけであればエンドポイントをPOSTするだけで良いのですが認証情報をheaderに入れて送ります。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;from airflow.providers.http.operators.http import SimpleHttpOperator
end_point = &amp;#34;cloud functionsの関数のエンドポイント&amp;#34;
invoke_task = SimpleHttpOperator(
task_id = &amp;#34;invoke_function&amp;#34;,
endpoint=end_point,
headers={&amp;#34;Content-Type&amp;#34;: &amp;#34;application/json&amp;#34;, &amp;#34;Authorization&amp;#34;: f&amp;#34;Bearer {id_token}&amp;#34;},
dag=dag
)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;はい、これだけでOKです。&lt;br&gt;
あとはよしなにDAGのなかにこのタスクを組み込んでください。&lt;br&gt;
こういう単純なHTTPリクエストを送るのはAirflowの1系だと面倒だったのですが2系ではSimpleHttpOperatorという便利なものがあるのでこれを使えばOKです。&lt;/p&gt;</description></item></channel></rss>